返回

LeetCode 20 - 有效括号的判断

后端

如何确定给定的括号字符串是否有效?

前言

LeetCode 20 是一个经典的算法问题,要求我们判断给定的括号字符串是否有效。括号字符串由小括号 (), 中括号 [] 和大括号 {} 组成,有效括号字符串需要满足以下条件:

  1. 括号必须成对出现,即每个左括号必须与一个右括号相匹配。
  2. 左括号必须在右括号之前出现。
  3. 括号必须按照正确的顺序出现,即 ()[]{}

我们可以通过栈数据结构来解决这个问题。栈是一种先进后出的数据结构,我们可以将左括号压入栈中,当遇到右括号时,我们从栈中弹出左括号,并检查两者是否匹配。如果所有括号都匹配,则字符串有效;否则,字符串无效。

代码实现

def is_valid(s):
  """
  判断给定的括号字符串是否有效。

  Args:
    s: 给定的括号字符串。

  Returns:
    布尔值,表示给定的括号字符串是否有效。
  """

  # 创建一个栈来存储左括号。
  stack = []

  # 遍历给定的字符串。
  for char in s:
    # 如果遇到左括号,则将其压入栈中。
    if char in "([{":
      stack.append(char)
    # 如果遇到右括号,则从栈中弹出左括号,并检查两者是否匹配。
    elif char in ")]}":
      if not stack:
        return False
      left = stack.pop()
      if (left == "(" and char != ")") or \
         (left == "[" and char != "]") or \
         (left == "{" and char != "}"):
        return False

  # 如果栈中还有左括号,则字符串无效。
  if stack:
    return False

  # 如果所有括号都匹配,则字符串有效。
  return True

测试

assert is_valid("()") == True
assert is_valid("[]") == True
assert is_valid("{}") == True
assert is_valid("([{}])") == True
assert is_valid("{[()]") == False
assert is_valid(")") == False
assert is_valid("([)]") == False

复杂度分析

  • 时间复杂度:O(n),其中 n 是给定字符串的长度。
  • 空间复杂度:O(n),其中 n 是给定字符串的长度。

总结

LeetCode 20 是一个经典的算法问题,要求我们判断给定的括号字符串是否有效。我们可以通过栈数据结构来解决这个问题,时间复杂度和空间复杂度都是 O(n)

延伸阅读