返回

深入浅出算法周刊第二期:括号匹配问题剖析

前端

前言

算法是计算机科学的重要组成部分,也是程序员必备的技能之一。Leetcode 是一个备受欢迎的在线算法学习平台,提供大量高质量的算法题目供用户练习。本期算法周刊将带领大家学习 Leetcode 上的经典题目——括号匹配问题。

问题

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

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

注意:空字符串可被认为是有效字符串。

思路分析

括号匹配问题看似简单,但实际上却蕴含着深刻的算法思想。解决这个问题的关键在于理解括号之间的嵌套关系。我们可以使用栈数据结构来模拟括号的嵌套。栈是一种遵循后进先出(LIFO)原则的数据结构,这意味着最后一个进入栈中的元素将第一个被取出。

具体来说,我们可以将左括号压入栈中,并将右括号与栈顶元素进行比较。如果右括号与栈顶元素匹配,则将栈顶元素弹出;否则,字符串无效。重复此过程,直到字符串处理完毕。如果栈为空,则字符串有效;否则,字符串无效。

代码实现

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

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

  Returns:
    如果字符串有效,返回 True;否则,返回 False。
  """

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

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

    # 如果当前字符是右括号,则检查栈顶元素是否与之匹配。
    else:
      if not stack:
        return False
      top = stack.pop()
      if (char == ')' and top != '(') or (char == ']' and top != '[') or (char == '}' and top != '{'):
        return False

  # 如果栈为空,则字符串有效;否则,字符串无效。
  return not stack

总结

括号匹配问题是算法学习中的一个经典题目,也是面试官经常考察的题目之一。通过本期算法周刊,你已经掌握了解决这一问题的方法。希望你能举一反三,将其应用到其他类似的问题中去。

练习题

  1. 给定一个字符串,找到最长的有效括号子字符串。
  2. 给定一个字符串,判断字符串是否可以被重新排列成一个有效括号字符串。
  3. 给定一个字符串,找到最长的有效括号子序列。