力扣20. 有效的括号

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

有效字符串需满足:

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

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


利用栈解题

注意:我们需要判定符号是成对出现的,若s = "([)]",我们栈中的元素按放入的顺序看为'(',  '[', 而此时来了 ')' 符号,不满足我们需要的 ']'符号,返回错误。

Ⅰ.计算传入的字符串s的大小n,如果n是奇数,直接返回false

Ⅱ.n为偶数的情况下,创建一个unordered_map<char,int> map,用来存放要判断的符号,以符号为key,将他们的编号设置为value。

unordered_map<int,int> map={
            {'(',1},
            {'[',2},
            {'{',3},
            {')',4},
            {']',5},
            {'}',6}
        };

Ⅲ.创建一个存放我们遍历s得到的字符

stack<char> stk;

Ⅳ.当往stk中放入数据的时候,判断数据对应的value是否>=1并且<=3,满足此条件,说明放入栈中的满足符号的左条件,即符号为  '(',  '[',  '{'  三者中的一种

Ⅵ.如果往stk中放入数据的时候,栈不为空,并且满足

map[stk.top()]==flag-3

说明放入栈中的满足符号的右条件,即符号为  ')',  ']',  '}'  三者中的一种

Ⅶ.如果上述两种条件都不满足,返回false

Ⅷ.遍历完s后,判断此时栈是否为空,如果为空返回true,否则返回false

完整代码

class Solution {
public:
    bool isValid(string s) {
        int n=s.size();
        if(n%2==1){
            return false;
        }
        unordered_map<int,int> map={
            {'(',1},
            {'[',2},
            {'{',3},
            {')',4},
            {']',5},
            {'}',6}
        };
        stack<char> stk;
        for(char cur:s){
            int flag=map[cur];
            if(flag>=1&&flag<=3){
                stk.push(cur);
            }
            else if(!stk.empty()&&map[stk.top()]==flag-3){
                stk.pop();
            }
            else{
                return false;
            }
        }
        if(!stk.empty()){
            return false;
        }
        return true;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_46780256/article/details/121596258