[栈]力扣 20. 有效的括号

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

有效字符串需满足:

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

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

题解

利用栈先进后出的机制,遍历s,当前元素s[i]进行如下判断:

1.是否是([{括号的左边,如果是,压栈;否则进入2.

2.不是括号左边那就是右边)]},判断当前右边符号能不能与栈顶的元素匹配为一个完整的括号,如果可以就出栈(因为栈顶括号已经被正确匹配了),下一次与右边元素匹配的就是之前还没有被正确匹配过的左边;如果不能正确匹配,进入3.

3.当前右边括号不能得到正确匹配,则s是不合法的字符串,返回false

结尾判断栈是否为空,如果为空说明可能有s="("这种情况,返回false,否则返回true

代码

class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        int len=s.size();
        for(int i=0;i<len;i++){
            //左边就进栈
            if(s[i]=='('||s[i]=='['||s[i]=='{')
                st.push(s[i]);
            //不是左边就判断栈顶元素是否与当前右边元素匹配
            else if(!st.empty()&&((s[i]==')'&&st.top()=='(')||s[i]==']'&&st.top()=='['||s[i]=='}'&&st.top()=='{'))
            {
                st.pop();
            }
            //不匹配就不是合法字符串
            else{
                return false;
            }
        }
        //如果栈没空,即s="(",也是非法
        if(!st.empty())
            return false;
        else
            return true;
    }
};

 

posted @ 2022-05-29 16:53  付玬熙  阅读(18)  评论(0编辑  收藏  举报