0
点赞
收藏
分享

微信扫一扫

20. 有效的括号————附带详细思路和代码

豆丁趣 2022-03-18 阅读 43

文章目录

0效果

请添加图片描述

1 题目

在这里插入图片描述

2 思路

如果字符串是奇数位,肯定存在不匹配的括号,返回false;如果字符串是偶数位,遇到左括号就进栈,遇到右括号,如果和栈顶的左括号匹配,栈顶元素出栈,如果不匹配,返回false,最后如果栈为空,证明括号是完全匹配的,返回true,否则返回false。

官方版答案,使用pair来判断括号是否匹配,可以少写很多if-else的代码。想法让人眼前一亮。最后返回栈是否为空,也简化了对返回结果的判定。

3 代码

class Solution {
public:
    bool isValid(string s) {
        int len = s.length();
        if (len % 2 == 1) return false;
        stack<char> strStack;
        for(int i = 0;i < len;i++){
            char tmp= s[i];
            if(tmp == '{' || tmp == '[' || tmp == '(') strStack.push(tmp);
            else if(tmp == '}' || tmp == ']' || tmp == ')'){
                if(strStack.empty()){//一定不存在与之匹配的括号
                    return false;
                }else{//遇到与之匹配的括号,栈中的括号就出栈
                    if(strStack.top() == '{' && tmp == '}') strStack.pop();
                    else if(strStack.top() == '[' && tmp == ']') strStack.pop();
                    else if(strStack.top() == '(' && tmp == ')') strStack.pop();
                    else return false;
                }
            }
        }
        if(strStack.empty()) return true;
        else return false;
    }
};

官方简化版代码:

class Solution {
public:
    bool isValid(string s) {
        int n = s.size();
        if (n % 2 == 1) {
            return false;
        }

        unordered_map<char, char> pairs = {
                {')', '('},
                {']', '['},
                {'}', '{'}
        };
        stack<char> stk;
        for (char ch: s) {
            if (pairs.count(ch)) {
                if (stk.empty() || stk.top() != pairs[ch]) {
                    return false;
                }
                stk.pop();
            }
            else {
                stk.push(ch);
            }
        }
        return stk.empty();
    }
};

举报

相关推荐

0 条评论