返回

深入解读 LeetCode 有效的括号 | 算法练习系列第一弹

前端

有效的括号

在编码的过程中,我们经常会遇到需要检查括号是否匹配的情况,比如在编写 HTML 代码时,我们必须确保每个开始标签都有一个对应的结束标签。为了解决这个问题,计算机科学家发明了“有效的括号”算法,它可以快速地检查一个字符串中的括号是否匹配。

算法

有效的括号算法使用栈数据结构来检查括号是否匹配。栈是一种后进先出(LIFO)的数据结构,这意味着最后添加的元素将首先被移除。

算法首先创建一个空栈。然后,它遍历字符串中的每个字符。如果遇到一个左括号,则将其压入栈中。如果遇到一个右括号,则将栈顶的元素弹出并检查它是否与右括号匹配。如果匹配,则继续遍历字符串;如果不匹配,则算法返回false,表示括号不匹配。

算法示例

为了更好地理解算法,我们来看一个示例。假设我们有一个字符串“(a+b)*(c-d)”。

  1. 算法首先创建一个空栈。
  2. 它遍历字符串中的每个字符。
  3. 当它遇到左括号“(”时,将其压入栈中。
  4. 当它遇到左括号“{”时,将其压入栈中。
  5. 当它遇到右括号“)”时,将栈顶的元素“(”弹出并检查它是否与右括号匹配。它们匹配,所以算法继续遍历字符串。
  6. 当它遇到右括号“}”时,将栈顶的元素“{”弹出并检查它是否与右括号匹配。它们匹配,所以算法继续遍历字符串。
  7. 当算法遍历完整个字符串后,栈中没有元素了,这表明所有括号都匹配。因此,算法返回true,表示括号匹配。

代码实现

def is_valid(s):
  """
  检查括号是否匹配。

  参数:
    s:要检查的字符串。

  返回:
    如果括号匹配,则返回 True;否则,返回 False。
  """

  # 创建一个空栈。
  stack = []

  # 遍历字符串中的每个字符。
  for char in s:
    # 如果遇到左括号,则将其压入栈中。
    if char in "([{":
      stack.append(char)

    # 如果遇到右括号,则将栈顶的元素弹出并检查它是否与右括号匹配。
    elif char in ")]}":
      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

应用场景

有效的括号算法在许多计算机科学领域都有应用,包括:

  • 编译器:编译器使用有效的括号算法来检查源代码中的括号是否匹配。
  • 解释器:解释器使用有效的括号算法来检查解释的代码中的括号是否匹配。
  • 文本编辑器:文本编辑器使用有效的括号算法来检查用户输入的文本中的括号是否匹配。
  • 格式化工具:格式化工具使用有效的括号算法来检查代码中的括号是否匹配。

总结

有效的括号算法是一种非常有用且通用的算法,它可以用于检查字符串中的括号是否匹配。该算法使用栈数据结构来实现,并且可以很容易地用任何编程语言实现。

希望这篇文章对您有所帮助。如果您有任何问题,请随时给我留言。