1. 程式人生 > >LeetCode 678. 有效的括號字串(C、C++、python)

LeetCode 678. 有效的括號字串(C、C++、python)

給定一個只包含三種字元的字串:(  和 *,寫一個函式來檢驗這個字串是否為有效字串。有效字串具有如下規則:

  1. 任何左括號 ( 必須有相應的右括號 )
  2. 任何右括號 ) 必須有相應的左括號 ( 。
  3. 左括號 ( 必須在對應的右括號之前 )
  4. * 可以被視為單個右括號 ) ,或單個左括號 ( ,或一個空字串。
  5. 一個空字串也被視為有效字串。

示例 1:

輸入: "()"
輸出:
True

示例 2:

輸入: "(*)"
輸出: True

示例 3:

輸入: "(*))"
輸出: True

注意:

字串大小將在 [1,100] 範圍內。

C

bool checkValidString(char* s) 
{
    int n=strlen(s);
    int* tmp=(int*)malloc(sizeof(int)*n);
    int* xin=(int*)malloc(sizeof(int)*n);
    int k=0;
    int r=0;
    for(int i=0;i<n;i++)
    {
        if('('==s[i])
        {
            tmp[k++]=i;
        }
        else if('*'==s[i])
        {
            xin[r++]=i;
        }
        else
        {
            if(0==k)
            {
                if(0==r)
                {
                    return false;
                }
                else
                {
                    r--;
                }
            }
            else
            {
                k--;
            }
        }        
    }
    while(k>0 && r>0)
    {
        if(tmp[k-1]>xin[r-1])
        {
            return false;
        }
        else
        {
            k--;
            r--;
        }
    }
    return 0==k;
}

C++

class Solution {
public:
    bool checkValidString(string s) 
    {
        int n=s.length();
        stack<int> tmp;  //存放左括號的位置
        stack<int> xin;  //存放*號的位置
        for(int i=0;i<n;i++)
        {
            if('('==s[i])
            {
                tmp.push(i);
            }
            else if('*'==s[i])
            {
                xin.push(i);
            }
            else
            {
                if(tmp.empty())
                {
                    if(xin.empty())
                    {
                        return false;
                    }
                    else
                    {
                        xin.pop();
                    }
                }
                else
                {
                    tmp.pop();
                }
            }
        }
        while(!tmp.empty() && !xin.empty())
        {
            if(tmp.top()>xin.top())
            {
                return false;
            }
            else
            {
                tmp.pop();
                xin.pop();
            }
        }
        return true==tmp.empty();
    }
};

python

class Solution:
    def checkValidString(self, s):
        """
        :type s: str
        :rtype: bool
        """
        n=len(s)
        tmp=[]
        xin=[]
        for i in range(n):
            if '('==s[i]:
                tmp.append(i)
            elif '*'==s[i]:
                xin.append(i)
            else:
                if(0==len(tmp)):
                    if(0==len(xin)):
                        return False
                    else:
                        del xin[-1]
                else:
                    del tmp[-1]
        while len(tmp)>0 and len(xin)>0:
            if tmp[-1]>xin[-1]:
                return False
            else:
                del tmp[-1]
                del xin[-1]
        return 0==len(tmp)