📘题目描述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([])"
输出:true
💡解题思路:栈(Stack)
✅核心思想
-
用栈保存遇到的待匹配右括号
-
每次遇到左括号时,将它对应的右括号压入栈
-
每次遇到右括号时:
-
栈为空 → 不匹配
-
弹出栈顶元素,若与当前右括号不一致 → 不匹配
-
-
全部遍历完后,如果栈为空 → 字符串有效
✅代码实现
class Solution:
def isValid(self, s: str) -> bool:
# 长度为奇数一定无效
if len(s) % 2:
return False
stack = []
for i in s:
if i == '(':
stack.append(')')
elif i == '[':
stack.append(']')
elif i == '{':
stack.append('}')
elif not stack or stack.pop() != i:
return False
# 栈必须为空才是有效括号
return not stack
✅可选写法:使用字典映射(更灵活)
class Solution:
def isValid(self, s: str) -> bool:
stack = []
mapping = {')': '(', ']': '[', '}': '{'}
for ch in s:
if ch in mapping.values():
stack.append(ch)
else:
if not stack or stack[-1] != mapping[ch]:
return False
stack.pop()
return not stack
⏱️复杂度分析
项目 | 复杂度 | 说明 |
---|---|---|
时间复杂度 | O(n) | 每个字符遍历一次 |
空间复杂度 | O(n) | 最坏情况栈大小为 n |
🖼️图示理解
字符串:{ [ ( ) ] }
遍历过程:
stack: → '}'
stack: → '}', ']'
stack: → '}', ']', ')'
匹配到 ')', 弹出')'
匹配到 ']', 弹出']'
匹配到 '}', 弹出'}'
最终 stack 为空 → 合法
🧱易错点总结
易错点 | 正确做法说明 |
---|---|
忽略了空字符串 | 空字符串是合法的,应返回 True |
忘记检查栈是否为空 | 弹栈前必须判断栈是否为空 |
没处理不对称的嵌套结构 | 栈顶元素必须与当前右括号匹配 |
长度为奇数时未提前返回 False | 奇数个括号不可能完全匹配 |