计算有效的括号
给定一个只包括 '(', ')', '{', '}', '[', ']' 的字符串,判断字符串是否有效。
def isValid(s):
stack = [] # 初始化空栈
mapping = {')': '(', '}': '{', ']': '['} # 右括号到左括号的映射
for char in s: # 遍历字符串中的每个字符
if char in mapping: # 如果当前字符是右括号
top = stack.pop() if stack else '#' # 弹出栈顶左括号(栈空时返回'#')
if mapping[char] != top: # 检查是否匹配
return False
else: # 如果是左括号,压入栈
stack.append(char)
return not stack # 栈空则所有括号匹配成功
-
输入:一个字符串
s,仅包含( ) { } [ ]和其他字符(其他字符不影响判断)。 -
输出:
True(如果括号匹配正确)或False(如果括号不匹配)。
核心思路
-
栈(Stack)的应用:
-
用栈来跟踪未闭合的括号,遵循 后进先出(LIFO) 原则。
-
遇到 左括号(
(,{,[)时压入栈。 -
遇到 右括号(
),},])时,检查栈顶的左括号是否与之匹配。
-
-
哈希表(字典)辅助:
-
使用字典
mapping存储右括号到左括号的映射,方便快速查找匹配关系。
-
关键步骤分析
-
处理右括号:
-
当遇到
),},]时,从栈中弹出栈顶元素(即最近未匹配的左括号)。 -
如果栈为空(无左括号可匹配),则返回
False(通过'#'占位符实现)。 -
检查弹出的左括号是否与当前右括号匹配(通过
mapping字典查找)。
-
-
处理左括号:
-
直接压入栈中,等待后续匹配。
-
-
最终检查:
-
遍历结束后,如果栈为空,说明所有括号均正确闭合;否则说明有未闭合的左括号。
-
示例演示
以输入 s = "()[{}]" 为例:
-
(:压入栈 →stack = ['('] -
):弹出(,与mapping[')']匹配 →stack = [] -
[:压入栈 →stack = ['['] -
{:压入栈 →stack = ['[', '{'] -
}:弹出{,与mapping['}']匹配 →stack = ['['] -
]:弹出[,与mapping[']']匹配 →stack = [] -
栈空 → 返回
True。
边界情况处理
-
空字符串:
-
直接返回
True(not []为True)。
-
-
只有左括号(如
"({"):-
栈不为空 → 返回
False。
-
-
只有右括号(如
")}"):-
弹出操作时栈为空 → 返回
False。
-
-
交错括号(如
"([)]"):-
]期望匹配[,但栈顶是(→ 返回False。
-
优化与变种
-
提前终止:
-
如果字符串长度为奇数,直接返回
False(因为括号必须成对出现)。
-
-
扩展其他符号:
-
如需支持更多括号类型(如
< >),只需扩展mapping字典。
-
总结
这段代码高效地利用了 栈 和 哈希表 的特性,以简洁的逻辑解决了括号匹配问题,是栈结构的经典应用场景。
浙公网安备 33010602011771号