入门级题解20(栈):有效的括号

题解更新:
解题思路
右括号:上来,自己动

代码

class Solution {
public:
     bool isValid(string s) {
        int n = s.size();
        if (n % 2 == 1) {
            return false;
        }//字符串长度为奇数直接返回false
//键:就是存的值的编号
//值:就是要存放的数据
//说到底这个题目中,都是左括号在自己动
        unordered_map<char, char> pairs = {
            {')', '('},
            {']', '['},
            {'}', '{'}
        };//哈希表,匹配的符号同一哈希值
        stack<char> stk;//建栈
        for (char ch: s) {//遍历s中的字符
        //这个判断是为了判断现在遍历到的字符是哈希表中的值吗
        //也就是说看这个字符是括号还是括回,
        //如果不是哈希表中的值,也就是括号,那就直接else,压入栈中
        //如果是哈希表中的值,也就是括回(右边的),那就执行下面的操作
            if (pairs.count(ch)) {
                //如果此时的栈为空  或者  栈顶元素和当前的元素不匹配
                //栈为空:说明现在这个符号只有右括回,没有左括号
                //与栈顶不匹配,说明不符合题目括号闭合要求
                //特别的是:[{}]是符合要求的[{(})]这种是不符合闭合要求的
                if (stk.empty() || stk.top() != pairs[ch]) {
                    return false;//
                }
                //这里相当于一个else,如果栈不为空,且现在遍历到的右括号与栈顶匹配,就把入栈的匹配的左括号出栈
                stk.pop();

作者:zhang-li-bin-t
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/you-gua-hao-shang-lai-zi-ji-dong-by-zhan-mwn9/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以下是原答案:

由于本人对栈的了解仅仅停留在push、pop以及后入先出中,所以先上官方题解。

class Solution {
public:
    bool isValid(string s) {
        int n = s.size();
        if (n % 2 == 1) {
            return false;
        }//字符串长度为奇数直接返回false
        
//哈希表,前面是键,后面是值,构成键值对
        unordered_map<char, char> pairs = {
            {')', '('},
            {']', '['},
            {'}', '{'}
        };
        stack<char> stk;//建栈
        for (char ch: s) {//遍历s中的字符
            if (pairs.count(ch)) {//如果哈希表中有该键
            //先决判断条件:此时栈是否为空,若栈不为空,或者栈顶 不等于 哈希表的键, return false;//说明这个测试用例不正确
                if (stk.empty() || stk.top() != pairs[ch]) {
                    return false;//说明这个测试用例不正确
                }
                //如果没有上述情况,出栈
                stk.pop();
            }
            else {
                stk.push(ch);//压栈
            }
        }
        return stk.empty();
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

官方题解也看不懂

class Solution {
public:
    bool isValid(string s) {
        int n = s.size();
        if (n % 2 == 1) {
            return false;
        }
 
        unordered_map<char, char> pairs = { //建立一个哈希表,第一个char为key,第二个char为value
            {')', '('}, //哈希表映射的右括号为键,左括号为值
            {']', '['},
            {'}', '{'}
        };
        stack<char> stk;
        for (char ch: s) { //遍历整个字符串
            if (pairs.count(ch)) { //pairs.count()用于查找键,若该键存在,则返回1,若不存在,则返回0
                if (stk.empty() || stk.top() != pairs[ch]) { //检查栈中是否有括号,若有括号,检查括号类型是否相同, stk.empty()一定要先判断
                    return false; //若不同,则返回false
                }
                stk.pop(); //若相同,则将栈中的括号抛出
            }
            else {
                stk.push(ch); //若当前的字符为左括号,则将当前字符压入栈中
            }
        }
        return stk.empty(); //若遍历完没有false,并且栈为空,则说明有效
    }
};

copy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值