LeetCode-栈-有效的括号

image-20250520203051704

LeetCode-栈-有效的括号

✏️ 关于专栏:专栏用于记录 prepare for the coding test


📝 有效的括号

🎯题目描述

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

有效字符串需满足:

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

🔗题目链接:有效的括号

🔍 输入输出示例

示例 1:

输入:s = "()"

输出:true

示例 2:

输入:s = "()[]{}"

输出:true

示例 3:

输入:s = "(]"

输出:false

示例 4:

输入:s = "([])"

输出:true

🧩题目提示

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

🧪AC

  1. 提前剪枝:如果字符串长度为奇数,直接返回 false,因为成对括号必须是偶数长度。
  2. 映射构建:使用哈希表(unordered_map)存储右括号对应的左括号,便于快速判断匹配关系。
  3. 遍历字符
    • 如果是左括号(不在 map 中),入栈
    • 如果是右括号:
      • 若栈为空,返回 false
      • 若栈顶不是其匹配的左括号,返回 false
      • 否则,弹出栈顶,表示匹配成功。
  4. 遍历结束后判断栈是否为空
    • 空栈:所有括号匹配成功;
    • 非空:存在未匹配的左括号,返回 false
示例输入输出说明
1s = "()"true简单有效匹配
2s = "()[]{}"true多种括号嵌套正确
3s = "(]"false括号类型不匹配
4s = "([])"true嵌套结构正确
5s = "((()"false左括号多余未闭合
字符操作栈状态说明
(左括号入栈(左括号压入栈
[左括号入栈([左括号压入栈
{左括号入栈([{左括号压入栈
}匹配栈顶 {,出栈([成功匹配一组括号
]匹配栈顶 [,出栈(成功匹配一组括号
)匹配栈顶 (,出栈栈空成功匹配一组括号
class Solution {
public:
    unordered_map<char,char> mp = {{')','('},{'}','{'},{']','['}};
    bool isValid(string s) {
        if(s.length() % 2){
            return false;
        }
        stack<char> stk;
        for(char c:s){
            if(!mp.contains(c)){
                stk.push(c);
            }else{
                if(stk.empty() || stk.top() != mp[c]){
                    return false;
                }
                stk.pop();
            }
        }
        return stk.empty();
    }
};
类型分析
时间复杂度O(n),n 为字符串长度,每个字符仅遍历一次
空间复杂度O(n),最坏情况栈空间接近 n(如全是左括号)

🌟 总结

  • 本题考察数据结构:栈的应用。
  • 括号匹配问题的通用解法就是利用**后进先出(LIFO)**的特点来模拟括号匹配过程。
  • 使用哈希表提高匹配效率,使代码更简洁优雅。
  • 别忘了处理栈为空字符串长度奇数的特殊情况。

🧩 “有效的括号”不仅考察栈的基本应用,更是递归思想在非递归形式中的体现 —— 每一对匹配的括号,实质上是问题的一个子结构。

🛠️ 掌握本题思路后,可一并解决如“最小删除使括号有效”、“最长有效括号”等进阶问题,形成以“括号问题”为核心的算法解题体系。

🎯 推荐刷题顺序:20 ➝ 22 ➝ 32 ➝ 150

难度题目说明
⭐⭐LeetCode 20. 有效的括号当前题目
⭐⭐⭐LeetCode 32. 最长有效括号动态规划/栈/双指针
⭐⭐⭐LeetCode 150. 逆波兰表达式求值栈表达式
⭐⭐⭐LeetCode 22. 括号生成回溯/DFS

❤️ 如果对你有帮助,别忘了点赞、收藏支持一下,我将持续更新更多高质量刷题笔记!
📘 点击查看 👉 算法笔记专栏:Prepare for the Coding Test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值