【力扣刷题笔记】20. 有效的括号 官方答案的代码详解

题目链接如下

https://leetcode-cn.com/problems/valid-parentheses/

完整代码如下

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

代码看了好久才看懂, 防止遗忘, 将其总结如下:
下面分段分析

        int n = s.size();
        if (n % 2 == 1) {
            return false;
        }

输入的括号字符串为 s, 当 s 的长度 n 是奇数时, 其一定不满足题目要求.
(当 n % 2 == 1 时, n 为奇数)

        unordered_map<char, char> pairs = {
            {')', '('},
            {']', '['},
            {'}', '{'}
        };

创建名为 pairs 的 无序 map 容器, 其中键为 ‘)’, ‘]’, ‘}’ (右括号), 值为’(’, ‘[’, ‘{’ (左括号)
该容器的作用如下:

pairs.count(key) // 在容器中查找以 key 键的键值对的个数

下面是难点

        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);	// ⑥
            }
        }

①处: 创建名为 stk 的栈
②处: 使用变量 ch 从左往右逐个遍历输入的括号字符串 s
③处: 判断 ch 是否是容器 pair 中的 key (也就是判断 ch 是否为右括号)

  • 若此处判定为, 则说明 ch 不是右括号, 也就说明 ch 是左括号, 则执行 ⑥ 处, 即将 ch 压入栈 stk 中.
  • 若此处判定为, 则说明 ch 是右括号, 则执行 ④ 处的 if 语句.

注: 当 ch 是右括号时, 只有栈顶元素为 ch 对应的左括号时, 才能保证 s 是有效的括号集合, 由此产生 ④ 处的代码.

④处: 如果栈是空的, 或者栈顶元素不等于 ch 对应的左括号, 则返回 false, 判定 s 不是有效的括号集.
⑤处: 若不满足 ④ 处的 if 判定条件, 即栈顶元素是 ch 对应的左括号, 则可以执行此处的弹栈代码, 即将栈顶元素弹出.

return stk.empty();
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值