返回

LeetCode有效括号,为何我的代码报错了?原来这里面有坑!

见解分享

是否曾对LeetCode上看似简单的「有效的括号」问题感到疑惑,却发现自己的代码始终报着让你一头雾水的错误?不用担心,你并不孤单!在这个代码迷宫中,许多程序员都曾陷入过同样的困境。让我们揭开这道题目的幕后黑手,探索隐藏的陷阱和解决它们的巧妙方法。

1. 问题的本质

LeetCode「有效的括号」问题要求我们判断一个只包含括号字符(', ')', {, }', [``, ]`的字符串是否有效。有效意味着括号成对出现,且成对的括号类型匹配,并且左括号必须先于对应的右括号。

2. 常见的陷阱

编写「有效的括号」代码时,最常见的陷阱包括:

  • 括号顺序不匹配: 例如,序列'(]'是不合法的,因为右括号']'出現在左括号'('之前。
  • 括号类型不匹配: 例如,序列'{]'是不合法的,因为右括号']'与左括号'{'类型不匹配。
  • 左括号多于右括号,或反之: 例如,序列'((['是不合法的,因为左括号比右括号多。

3. 解决方法:巧用栈

解决「有效的括号」问题的关键在于使用栈数据结构。栈是一种遵循后进先出(LIFO)原则的线性数据结构。我们可以将左括号压入栈中,当遇到右括号时,检查栈顶元素是否为与该右括号匹配的左括号。如果是,则弹出栈顶元素,表示一对括号匹配成功;否则,字符串无效。

例如,对于字符串'()[]{}',我们可以按如下步骤操作:

  1. 左括号'('入栈。
  2. 右括号')'与栈顶左括号'('匹配,弹出栈顶元素。
  3. 左括号'['入栈。
  4. 右括号']'与栈顶左括号'['匹配,弹出栈顶元素。
  5. 左括号'{'入栈。
  6. 右括号'}'与栈顶左括号'{'匹配,弹出栈顶元素。
  7. 栈为空,说明所有括号都成对匹配,字符串有效。

4. 代码实现

def is_valid(s: str) -> bool:
  """
  判断一个只包含括号字符的字符串是否有效。

  Args:
    s (str): 只包含括号字符的字符串。

  Returns:
    bool: 如果字符串有效,返回 True;否则,返回 False。
  """
  stack = []
  bracket_pairs = {')': '(', '}': '{', ']': '['}

  for char in s:
    if char in bracket_pairs.values():
      stack.append(char)
    elif char in bracket_pairs.keys():
      if not stack or stack.pop() != bracket_pairs[char]:
        return False
    else:
      return False

  return not stack

5. 总结

通过巧妙地使用栈数据结构,我们可以有效解决LeetCode「有效的括号」问题。通过避免常见的陷阱并遵循正确的策略,我们可以自信地编写出能够处理各种括号组合的代码。下次你在LeetCode上遇到这个问题时,记住这些技巧,你就能轻松攻克它!