题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
示例 1:
- 输入: "()"
- 输出: true
示例 2:
- 输入: "()[]{}"
- 输出: true
示例 3:
- 输入: "(]"
- 输出: false
示例 4:
- 输入: "([)]"
- 输出: false
示例 5:
- 输入: "{[]}"
- 输出: true
#
代码示例
class Solution:
def isValid(self, s: str) -> bool:
stack = [] # 使用栈来辅助判断括号匹配
bracket_map = {'(': ')', '[': ']', '{': '}'}
for char in s:
if char in bracket_map: # 如果是左括号,入栈
stack.append(char)
else:
if not stack: # 如果是右括号且栈为空,说明不匹配
return False
top_char = stack.pop() # 弹出栈顶元素
if char != bracket_map[top_char]: # 判断是否匹配
return False
return not stack # 如果栈为空,说明所有括号都匹配
一开始看到这个括号匹配的问题时,我的第一反应是创建一个字典,以左括号为键,右括号为值。接着,通过遍历字符串的每个字符,如果是左括号就入栈,如果遇到右括号,就与栈尾的字符进行匹配。如果匹配成功,就出栈,否则返回 False。最后,如果遍历完字符串后,栈为空,就返回 True。
然而,通过学习代码随想录后,我更深刻地理解了三种特殊情况。首先,如果遍历完字符串后,栈仍然不为空,说明有左括号没有右括号匹配,返回 False。其次,如果在遍历字符串匹配的过程中,发现栈为空,说明没有匹配的字符,同样返回 False。最后,如果遍历字符串匹配的过程中,栈已经为空,没有匹配的字符了,说明右括号没有找到对应的左括号,同样返回 False。