20. 有效的括号
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([])"
输出:true
用栈保存遇到的待匹配右括号
每次遇到左括号时,将它对应的右括号压入栈
每次遇到右括号时:
栈为空 → 不匹配
弹出栈顶元素,若与当前右括号不一致 → 不匹配
全部遍历完后,如果栈为空 → 字符串有效
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 | 奇数个括号不可能完全匹配 |