LeetCode 刷题日记 Day18|20. 有效的括号:栈的经典入门实战
大家好这是我的 LeetCode 刷题日记第 18 天。今天我们来搞定一道栈结构最经典、面试最高频的必刷题 ——20. 有效的括号。这道题是理解「栈」最好的入门题建议先搞懂栈的先进后出LIFO特性再来看这道题会非常丝滑。 题目回顾题目链接https://leetcode.cn/problems/valid-parentheses/给定一个只包括(、)、{、}、[、]的字符串s判断字符串是否有效。有效规则左括号必须用相同类型的右括号闭合左括号必须以正确的顺序闭合每个右括号都有一个对应的相同类型左括号示例输入()→ 输出true输入()[]{}→ 输出true输入(]→ 输出false输入([)]→ 输出false输入([])→ 输出true 核心思路为什么用栈括号匹配的本质是后出现的左括号要先闭合这和栈「先进后出」的特性完全一致。思路一句话总结遇到左括号入栈等着被匹配遇到右括号看栈顶是不是对应的左括号匹配 → 出栈不匹配 / 栈空 → 直接无效遍历完后栈必须为空才算全部匹配成功 详细算法步骤快速剪枝字符串长度为奇数直接返回false不可能成对建立映射用字典存右括号 → 左括号的对应关系遍历字符串左括号压入栈右括号栈空 → 无匹配左括号 →false栈顶不匹配 →false匹配 → 弹出栈顶最终判断栈为空才是有效括号✅ 代码实现Pythonpython运行def isValid(s: str) - bool: # 长度奇数直接返回 if len(s) % 2 ! 0: return False bracket_map {): (, ]: [, }: {} stack [] for char in s: # 右括号 if char in bracket_map: # 栈空 或 不匹配 if not stack or stack[-1] ! bracket_map[char]: return False stack.pop() # 左括号 else: stack.append(char) # 所有左括号必须匹配完 return len(stack) 0 复杂度分析时间复杂度O(n)每个字符只遍历一次入栈出栈都是 O (1)空间复杂度O(n)最坏情况全是左括号栈存 n 个元素 易错点提醒([)]这种交叉嵌套是无效的只判断匹配不够最后栈必须为空右括号开头直接false不要继续遍历 配套讲解视频讲解https://www.bilibili.com/video/BV1AF411w78g