返回

从理解题意到实现算法——LeetCode20题解析

后端

正文

理解题意

LeetCode的第20道题“有效的括号”是一道经典的算法题,考察的是对数据结构——栈的理解和运用。题目要求判断给定字符串中括号是否有效。有效括号是指:

  • 每个左括号必须对应一个右括号。
  • 左括号和右括号必须一一对应,不能出现嵌套。
  • 括号必须成对出现,不能出现单独的左括号或右括号。

例如,以下字符串中的括号是有效的:

()
[]
{}

以下字符串中的括号是无效的:

([)]
{[]}
(()

选择数据结构

解决这道题的关键是选择合适的数据结构。栈是一种先进后出的数据结构,非常适合用来判断括号是否有效。栈的原理很简单:后进先出,就像一摞盘子一样。当我们把一个左括号压入栈中,就相当于把一个盘子放在摞盘子的最上面。当我们遇到一个右括号时,就相当于把摞盘子最上面的盘子取出来。如果取出来的盘子与压进去的左括号不匹配,那么括号就是无效的。

代码实现

下面是使用Python实现的代码:

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

  Args:
    s: 给定字符串。

  Returns:
    True if the括号 are valid, False otherwise.
  """

  # 创建一个栈来存储左括号。
  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 != ")":
        return False
      elif top == "[" and char != "]":
        return False
      elif top == "{" and char != "}":
        return False

  # 如果栈不为空,则括号无效。
  if stack:
    return False

  # 否则,括号有效。
  return True


# 测试代码。
print(is_valid("()"))  # True
print(is_valid("[]"))  # True
print(is_valid("{}"))  # True
print(is_valid("([)]"))  # False
print(is_valid("{[]}"))  # False
print(is_valid("(()"))  # False

总结

LeetCode的第20道题“有效的括号”是一道经典的算法题,考察的是对数据结构——栈的理解和运用。通过这道题,我们可以学习到如何使用栈来解决实际问题。同时,这道题也是算法新手入门的一块很好的试金石。