LeetCode-栈-有效的括号

LeetCode-栈-有效的括号_第1张图片

LeetCode-栈-有效的括号

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


文章目录

  • LeetCode-栈-有效的括号
    • 有效的括号
      • 题目描述
      • 输入输出示例
      • 题目提示
      • AC
    • 总结

有效的括号

题目描述

给定一个只包括 '('')''{''}''['']' 的字符串 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
示例 输入 输出 说明
1 s = "()" true 简单有效匹配
2 s = "()[]{}" true 多种括号嵌套正确
3 s = "(]" false 括号类型不匹配
4 s = "([])" true 嵌套结构正确
5 s = "((()" false 左括号多余未闭合
字符 操作 栈状态 说明
( 左括号入栈 ( 左括号压入栈
[ 左括号入栈 ([ 左括号压入栈
{ 左括号入栈 ([{ 左括号压入栈
} 匹配栈顶 {,出栈 ([ 成功匹配一组括号
] 匹配栈顶 [,出栈 ( 成功匹配一组括号
) 匹配栈顶 (,出栈 栈空 成功匹配一组括号
class Solution {
public:
    unordered_map mp = {{')','('},{'}','{'},{']','['}};
    bool isValid(string s) {
        if(s.length() % 2){
            return false;
        }
        stack 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

你可能感兴趣的:(leetcode,算法)