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)

猜你喜欢

转载自blog.csdn.net/qq_27060423/article/details/83959401