Leetcode(20)-有效的括号

给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

自己算法思路:首先判断字符串是否为空,如果为空,直接认为是有效字符串,返回true;然后利用stack的数据结构来解题,逐个判断字符串,如果是左括号,就打入栈中,如果是右括号,判断栈是否为空,为空则返回false,再判断栈顶是不是对应的左括号,如果是,则将栈顶的元素出栈,如果不是,则返回false。

bool isValid(string s)
{
    if(s.empty()) return true;
    stack<char> sta;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='(' || s[i]=='[' || s[i]=='{')
        {
            sta.push(s[i]);
        }
        else if(sta.empty())
        {
            return false;
        }
        else if((s[i] == ')' && sta.top()=='(') ||(s[i] == ']' && sta.top()=='[')||(s[i] == '}' && sta.top()=='{'))
        {
            sta.pop();
        }
        else
            return false;
    }
    if(sta.empty())
        return true;
    else
        return false;
}

算法缺陷:因为每次只打入左括号,如果第一个就是右括号,则要先判断栈是否为空,否则访问栈顶元素则会出错。这样判断情况太多,不够简洁。

bool isValid(string s) {
        stack<char> result;  
        int n=s.size();  
        if(n==0) return true;  
     for(int i=0;i<n;i++)  
            {  
                if(result.empty())  
                    result.push(s[i]);  
                else if(result.top()=='('&&s[i]==')'||  
                      result.top()=='['&&s[i]==']'||  
                      result.top()=='{'&&s[i]=='}')   
                        result.pop();  
                else  
                    result.push(s[i]);  
                  
            }  
            return result.empty(); 
    }

只要栈中的元素为空,就入栈,而且栈顶和目前的元素无法配对的时候,同样打入栈中,这样避免了一开始就是右括号,不入栈,接下来要访问栈顶的尴尬,其余思路和上面的一样,最后只需要判断栈中是不是为空就好了。

原文地址:https://www.cnblogs.com/mini-coconut/p/8963720.html