LongDz 的数字文墨提案

20. 有效的括号

3 min

题目

20. 有效的括号 简单

思路

核心思想是使用栈进行括号匹配:遇到左括号入栈,遇到右括号则检查栈顶左括号是否与之匹配。

正确性在于栈的先进后出特性完美模拟括号的嵌套结构:当遇到右括号时,只有最近未匹配的左括号(栈顶)才能与之配对,因为括号闭合必须遵循后进先出顺序。若栈顶括号类型不匹配或栈为空(右括号多余),则立即返回无效;遍历结束后栈必须为空(左括号无多余)。

  • Step 1: 初始化栈和括号映射表(左括号→右括号)
  • Step 2: 遍历字符串,若字符是左括号则入栈
  • Step 3: 若字符是右括号,检查栈顶左括号是否匹配:匹配则弹出,否则返回false
  • Step 4: 遍历结束后,栈为空则返回true,否则false

复杂度

  • 时间复杂度: O(n)O(n),其中nn为字符串长度。每个字符仅遍历一次,栈操作均为O(1)O(1)
  • 空间复杂度: O(n)O(n),最坏情况下(如全为左括号)栈需存储整个字符串。

代码

class Solution {
public:
    bool isValid(string s) {
        stack<char>stk;
        map<char,char>mp;
        mp['('] = ')';mp['{'] ='}';mp['['] = ']';
        for(auto i:s){
            if(stk.empty()){
                if(!mp[i])
                return false;
                else
                stk.push(i);
            }
            else{
                if(mp[i]){
                    stk.push(i);
                }
                else{
                    if(mp[stk.top()] == i){
                        stk.pop();
                    }
                    else
                    return false;
                }
            }
class Solution {
public:
    bool isValid(string s) {
        stack<char>stk;
        map<char,char>mp;
        mp['('] = ')';mp['{'] ='}';mp['['] = ']';
        for(auto i:s){
            if(stk.empty()){
                if(!mp[i])
                return false;
                else
                stk.push(i);
            }
            else{
                if(mp[i]){
                    stk.push(i);
                }
                else{
                    if(mp[stk.top()] == i){
                        stk.pop();
                    }
                    else
                    return false;
                }
            }
        }
        if(stk.empty())
        return true;
        else
        return false;
    }
};