代码随想录算法训练营第九天(1)|20. 有效的括号

32 阅读2分钟

题目描述

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 注意空字符串可被认为是有效字符串。

示例 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。