LC.20 | 有效的括号 | 栈 | 括号匹配

输入:一个只包括 '('')''{''}''['']' 的字符串 s。

要求:判定左右括号顺序是否正确匹配。

输出:true 或者 false


思路:一开始想的很复杂,对应栈空不空以及各个左右括号的情况,依次进行了判定。

实际上,只需要进行左右括号判定就好,左括号就入栈,可以延迟匹配,但是右括号必须立即匹配成功,不然返回false。

需要注意的是,最后需要辅助栈为空才能返回true,不然栈里容易留下没有匹配的左括号。


复杂度:

        时间复杂度:O(n)

        空间复杂度:O(n)


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

        //return true;
        return tmp.empty();//最后需要栈空才是true
    }
};


class Solution {
public:
    bool isValid(string s) {
        stack<char> tmp;
        for (char c : s) {
            // 1. 只要是左括号,就压入栈
            if (c == '(' || c == '[' || c == '{') {
                tmp.push(c);
            } 
            // 2. 否则(即遇到了右括号)
            else {
                // 此时如果栈是空的(如 "}"),或者栈顶不匹配(如 "(]"),则无效
                if (tmp.empty() || 
                    (c == ')' && tmp.top() != '(') ||
                    (c == ']' && tmp.top() != '[') ||
                    (c == '}' && tmp.top() != '{')) 
                {
                    return false;
                }
                // 匹配成功,弹出栈顶的左括号
                tmp.pop();
            }
        }
        
        // 3. 最后,栈必须为空
        return tmp.empty();
    }
};

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值