返回

LeetCode 20. 有效的括号:解码字符串的奥妙

前端

问题定义

给定一个由小括号('(',')')、中括号('{}')和大括号('[]')组成的字符串,判断该字符串是否有效。有效括号字符串的定义如下:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。

例如,以下字符串都是有效的:

"()"
"{}"
"[]"
"(){}"
"([])"

以下字符串都是无效的:

"(]"
"([)]"
"{[]}"

解决方案

栈是一种先进先出的数据结构,非常适合解决括号匹配问题。我们可以使用栈来存储左括号,当遇到右括号时,我们可以从栈中取出最后一个左括号并与之匹配。如果所有括号都能匹配,则该字符串是有效的;否则,该字符串是无效的。

def is_valid(s):
  stack = []
  for char in s:
    if char in "([{":
      stack.append(char)
    else:
      if not stack:
        return False
      top = stack.pop()
      if (top == "(" and char != ")") or (top == "{" and char != "}") or (top == "[" and char != "]"):
        return False
  return not stack

递归

递归是一种函数调用自身的方法,非常适合解决具有嵌套结构的问题。我们可以使用递归来逐层匹配括号,直到所有括号都匹配或遇到无效匹配为止。

def is_valid(s):
  def helper(i, j):
    if i > j:
      return True
    if s[i] not in "([{":
      return False
    match = {")": "(", "}": "{", "]": "["}
    if s[j] != match[s[i]]:
      return False
    return helper(i + 1, j - 1)

  return helper(0, len(s) - 1)

字符串处理

字符串处理是一种更直接的方法,不需要使用栈或递归。我们可以使用字符串的操作来判断括号是否匹配。例如,我们可以使用以下正则表达式来判断字符串是否有效:

import re

def is_valid(s):
  return re.match("^[()]*
import re

def is_valid(s):
  return re.match("^[()]*$", s) or re.match("^{}$", s) or re.match("^\[\]*$", s)
quot;
, s) or re.match("^{}
import re

def is_valid(s):
  return re.match("^[()]*$", s) or re.match("^{}$", s) or re.match("^\[\]*$", s)
quot;
, s) or re.match("^\[\]*
import re

def is_valid(s):
  return re.match("^[()]*$", s) or re.match("^{}$", s) or re.match("^\[\]*$", s)
quot;
, s)

总结

在本文中,我们讨论了 LeetCode 20 的有效括号问题,并介绍了使用栈、递归和字符串处理技术来解决该问题的各种方法。这些方法各有优缺点,您可以根据自己的喜好选择使用哪种方法。无论您选择哪种方法,重要的是要理解该问题的基本原理,并能够将这些原理应用于其他类似的问题。

扩展阅读