题目

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:

  1. 输入:s = "()"
  2. 输出:true

示例 2:

  1. 输入:s = "()[]{}"
  2. 输出:true

示例 3:

  1. 输入:s = "(]"
  2. 输出:false

示例 4:

  1. 输入:s = "([)]"
  2. 输出:false

示例 5:

  1. 输入:s = "{[]}"
  2. 输出:true

提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成

题解

方法一:栈
判断括号的有效性可以使用「栈」这一数据结构来解决。

我们遍历给定的字符串 s。当我们遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们可以将这个左括号放入栈顶。

当我们遇到一个右括号时,我们需要将一个相同类型的左括号闭合。此时,我们可以取出栈顶的左括号并判断它们是否是相同类型的括号。如果不是相同的类型,或者栈中并没有左括号,那么字符串 ss 无效,返回 False。为了快速判断括号的类型,我们可以使用哈希表存储每一种括号。哈希表的键为右括号,值为相同类型的左括号。

在遍历结束后,如果栈中没有左括号,说明我们将字符串 ss 中的所有左括号闭合,返回 True,否则返回 False。

注意到有效字符串的长度一定为偶数,因此如果字符串的长度为奇数,我们可以直接返回 False,省去后续的遍历判断过程。
baa8829ac398e665eb645dca29eadd631e2b337e05022aa5a678e091471a4913-20.gif

答案

  1. class Solution:
  2. def isValid(self, s: str) -> bool:
  3. if len(s) % 2 == 1:
  4. return False
  5. # 哈希表存储他们的对应关系
  6. pairs = {
  7. ")": "(",
  8. "]": "[",
  9. "}": "{",
  10. }
  11. stack = list()
  12. for ch in s:
  13. if ch in pairs:
  14. # 如果栈为空或者栈内最后的值不符合要求则 False
  15. if not stack or stack[-1] != pairs[ch]:
  16. return False
  17. # 出栈
  18. stack.pop()
  19. else:
  20. # 入栈
  21. stack.append(ch)
  22. return not stack