Leetcode-有效的括号

Posted Mini_Coconut

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode-有效的括号相关的知识,希望对你有一定的参考价值。

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

有效字符串需满足:

  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(); 
    }

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

以上是关于Leetcode-有效的括号的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-----20. 有效的括号

LeetCode经典栈-有效的括号(难度:⭐)

leetcode20有效的括号

LeetCode 20. 有效的括号

leetcode 32.最长有效括号

LeetCode 32. 最长有效括号c++/java详细题解