有效的括号 提示 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。 示例 1: 输入:s = "()" 输出:true 示例 2: 输入:s = "()[]{}" 输出:true 示例 3: 输入:s = "(]" 输出:false 示例 4: 输入:s = "([])" 输出:true 示例 5: 输入:s = "([)]" 输出:false 提示: 1 <= s.length <= 104 s 仅由括号 '()[]{}' 组成
解题思路
判断有效括号的核心思路是利用栈的「后进先出」特性:
-
遍历字符串,遇到左括号(
(/{/[)时,将其压入栈中; -
遇到右括号(
)/}/])时,检查栈顶是否是匹配的左括号:- 若栈为空(无匹配的左括号)或栈顶不匹配,直接返回
false; - 若匹配,弹出栈顶元素(完成一次有效闭合);
- 若栈为空(无匹配的左括号)或栈顶不匹配,直接返回
-
遍历结束后,若栈为空(所有左括号都完成闭合),则返回
true,否则返回false。
代码实现(Python)
python
运行
def isValid(s: str) -> bool:
# 定义右括号到左括号的映射,方便快速匹配
bracket_map = {')': '(', '}': '{', ']': '['}
stack = []
for char in s:
# 左括号:压入栈
if char in bracket_map.values():
stack.append(char)
# 右括号:检查匹配
elif char in bracket_map.keys():
# 栈空 或 栈顶不匹配,直接返回False
if not stack or stack[-1] != bracket_map[char]:
return False
# 匹配成功,弹出栈顶
stack.pop()
# 题目保证只有括号,此分支可省略
else:
return False
# 遍历结束后栈必须为空(所有左括号都闭合)
return len(stack) == 0
代码解释
-
映射表:
bracket_map把右括号映射到对应的左括号,避免多层if-else判断; -
栈操作:
- 左括号直接入栈,等待后续匹配;
- 右括号先检查栈是否为空(无左括号可匹配),再检查栈顶是否匹配,不匹配则直接返回
false;
-
最终校验:遍历完成后,若栈非空,说明有未闭合的左括号,返回
false。
测试用例验证
python
运行
# 示例1
print(isValid("()")) # True
# 示例2
print(isValid("()[]{}")) # True
# 示例3
print(isValid("(]")) # False
# 示例4
print(isValid("([])")) # True
# 示例5
print(isValid("([)]")) # False
复杂度分析
- 时间复杂度:O (n),n 是字符串长度,每个字符仅遍历一次,栈操作(压入 / 弹出)都是 O (1);
- 空间复杂度:O (n),最坏情况(全是左括号)栈需要存储所有字符。
该解法是判断有效括号的最优解,逻辑清晰且效率高,能覆盖所有边界情况(如空栈、嵌套括号、顺序错误等)。