返回

强势通关LeetCode,剑指最强百题!

前端

每日LeetCode挑战:有效括号

引言

算法学习绝非一蹴而就,需要持之以恒的练习和总结。LeetCode每日挑战为你提供了一个绝佳的平台,让你每天专注解决一道精选题目,循序渐进地提升算法技能。

今天,我们将一起征服LeetCode Top100中的第3道题——有效的括号。这道题看似简单,却蕴含着栈的数据结构和应用原理,非常适合初学者入门。

题目

给定一个只包含圆括号'('')'的字符串,判断它是否为一个有效的括号字符串。

有效括号字符串需满足以下条件:

  • 每个左括号必须有其对应的右括号。
  • 括号必须以正确的顺序嵌套,即左括号必须在对应的右括号之前。

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

  • "()"
  • "()[]{}"
  • "{[]}"

以下字符串为无效的括号字符串:

  • "([)]"
  • "({[)]}"
  • "()"

解题思路

这道题可以使用栈的思路来解决。栈是一种先进后出的数据结构,非常适合处理括号匹配的问题。

  1. 初始化一个栈

首先,我们需要初始化一个栈来存储左括号。

  1. 遍历字符串

接下来,我们将遍历给定的字符串。对于每个字符,我们可以根据以下规则进行处理:

  • 如果当前字符是左括号,则将其压入栈中。
  • 如果当前字符是右括号,则检查栈是否为空。如果栈为空,则说明字符串中存在右括号而没有对应的左括号,因此返回false。否则,弹出栈顶元素并检查它是否与当前右括号匹配。如果不匹配,则说明括号不匹配,因此返回false
  1. 检查栈是否为空

遍历完字符串后,我们需要检查栈是否为空。如果栈不为空,则说明字符串中存在左括号而没有对应的右括号,因此返回false。否则,返回true

代码实现

def is_valid_parentheses(s):
  """
  判断一个字符串是否为有效的括号字符串。

  Args:
    s: 给定的字符串。

  Returns:
    如果字符串有效,返回`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 not is_matching(top, char):
        return False

  # 检查栈是否为空
  if stack:
    return False

  # 如果所有括号都匹配,则返回`true`
  return True


def is_matching(left, right):
  """
  检查两个括号是否匹配。

  Args:
    left: 左括号。
    right: 右括号。

  Returns:
    如果括号匹配,返回`true`,否则返回`false`。
  """

  return (left == "(" and right == ")") or \
         (left == "[" and right == "]") or \
         (left == "{" and right == "}")


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

总结

通过这道题,我们学习了如何使用栈来解决括号匹配的问题。栈是一种非常重要的数据结构,在算法中有着广泛的应用。希望大家能够通过这道题,对栈有一个更深入的理解。

继续挑战LeetCode每日挑战,不断提升算法和编程技巧,向着算法进阶之路迈进!