20. 有效的括号

问题

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

分析

显然是栈。然而是否可以记录右括号的可用个数?当读到左括号时候右括号可用+1,代码如下:

class Solution {
public:
    int l1 = 0, l2 = 0, l3 = 0;
    int r1 = 0, r2 = 0, r3 = 0;
    bool isValid(string s) {
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '(') {r1++;}
            if (s[i] == '{') {r2++;}
            if (s[i] == '[') {r3++;}
            if (s[i] == ')') {if(r1 > 0) {r1--;} else return false;}
            if (s[i] == '}') {if(r2 > 0) {r2--;} else return false;}
            if (s[i] == ']') {if(r3 > 0) {r3--;} else return false;}
        }
        if (!r1 && !r2 & !r3) {return true;}
        return false;
    }
};

不行。因为对于"([)]"无法通过,忽略了要先匹配最近的一个左括号这个条件。

代码

class Solution {
public:
    bool isValid(string s) {
        stack<char> stk;
        for (int i = 0; i < s.size(); i++) {
            if (!stk.empty() &&
                ((stk.top() == '(' && s[i] == ')') ||
                (stk.top() == '{' && s[i] == '}') ||
                (stk.top() == '[' && s[i] == ']'))) {
                stk.pop();
                continue;
            }
            stk.push(s[i]);
        }
        if (stk.empty()) {
            return true;
        }
        return false;
    }
};
posted @ 2025-06-14 01:22  saulstavo  阅读(10)  评论(0)    收藏  举报