返回

解码LeetCode第20题:围栏括号的有效性

前端

让我们踏上LeetCode系列之旅的第一步,一起征服第20题:有效的括号。这道题考察了我们处理字符串和识别括号有效性的能力。让我们深入解析题目,了解题目的本质:

给定一个只包含 (、)、{、}、[、] 的字符串,判断字符串中的括号是否有效配对。

为了更好地理解有效括号的含义,让我们用几个例子来帮助你:

  • "()"、"{}"、"[]" 都是有效的括号,因为其中的括号都成对出现且匹配。
  • "(]"、"{[]}"、"([)]" 都不是有效的括号,因为括号不匹配或者顺序不对。
  • "(){}"、"([])" 都是有效的括号,因为括号成对出现且顺序正确。

现在,我们已经对有效括号有了基本认识,接下来让我们探索解决这个问题的算法原理:

栈数据结构

栈是一种遵循后进先出(LIFO)原则的数据结构,这意味着最后进入栈中的元素将第一个出来。我们可以利用栈来解决这个问题,具体步骤如下:

  1. 创建一个空栈。
  2. 从左到右遍历字符串中的每个字符。
  3. 如果当前字符是左括号((、{、[),将其压入栈中。
  4. 如果当前字符是右括号()、}、]),检查栈顶元素是否与当前字符匹配。如果是,则弹出栈顶元素;如果不是,则当前字符串不是有效括号。
  5. 重复步骤 3 和 4,直到遍历完整个字符串。
  6. 如果栈为空,则字符串中的括号是有效的;否则,字符串中的括号不是有效的。

现在,让我们用代码示例来具体演示算法的实现:

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

  参数:
    s: 输入字符串,只包含 (、)、{、}、[、]。

  返回值:
    布尔值,表示字符串中的括号是否有效配对。
  """

  # 创建一个空栈
  stack = []

  # 从左到右遍历字符串中的每个字符
  for char in s:
    # 如果当前字符是左括号,将其压入栈中
    if char in "([{":
      stack.append(char)
    # 如果当前字符是右括号,检查栈顶元素是否与当前字符匹配
    elif char in ")]}":
      # 如果栈顶元素与当前字符匹配,则弹出栈顶元素
      if stack and stack[-1] == "([{".find(char):
        stack.pop()
      # 如果栈顶元素与当前字符不匹配,则当前字符串不是有效括号
      else:
        return False

  # 如果栈为空,则字符串中的括号是有效的;否则,字符串中的括号不是有效的
  return not stack

通过这篇博客文章,我们共同探索了LeetCode系列的第一题:有效的括号。我们从题目的理解入手,深入剖析了有效括号的含义,并详细讲解了解决问题的算法原理和代码实现。希望你能从中有所收获,并对LeetCode系列后续的题目充满期待。如果你有任何问题或建议,欢迎在评论区留言,我会尽力解答和改进。让我们一起携手,在LeetCode的挑战中不断进步,一起解码编程的奥秘!