返回

攻克 LeetCode 20:掌握有效括号的进阶之钥

见解分享

【刷穿LeetCode】20. 有效的括号|高效且实用的刷题实战

在 LeetCode 的众多难题中,第 20 题“有效的括号”可谓一道经典。其看似简单的题目之下,却暗藏着巧妙的考察点和求解方法。让我们踏上刷题之旅,一起探索这道题目的奥秘。

破题利器:栈的巧妙应用

判断括号的有效性本质上是匹配左括号和右括号的过程。我们希望先出现的左括号能与后出现的同类型右括号配对。受此启发,我们可以借助一种先进后出的数据结构——栈来解决问题。

栈的基本原理是“后进先出”,即后压入栈内的元素会先弹出。我们将左括号压入栈中,遇到右括号时,检查栈顶元素是否与当前右括号匹配。若匹配,则弹出栈顶元素,否则字符串无效。

def is_valid(s: str) -> bool:
  stack = []
  for char in s:
    if char in ["(", "{", "["]:
      stack.append(char)
    else:
      if not stack:
        return False
      if (char == ")" and stack[-1] == "(") or \
         (char == "}" and stack[-1] == "{") or \
         (char == "]" and stack[-1] == "["):
        stack.pop()
      else:
        return False
  return not stack

详尽解析:代码逐行剖析

def is_valid(s: str) -> bool:

该函数接收一个包含括号的字符串 s,返回一个布尔值,表示字符串是否有效。

  stack = []

初始化一个空栈 stack,用于存储左括号。

  for char in s:

遍历字符串 s 中的每个字符 char

    if char in ["(", "{", "["]:
      stack.append(char)

如果 char 是左括号,则将其压入栈中。

    else:

如果 char 是右括号,则继续执行以下代码块:

      if not stack:
        return False

如果栈为空,说明之前没有匹配的左括号,因此字符串无效。

      if (char == ")" and stack[-1] == "(") or \
         (char == "}" and stack[-1] == "{") or \
         (char == "]" and stack[-1] == "["):
        stack.pop()

检查 char 是否与栈顶元素匹配。如果匹配,则弹出栈顶元素。

      else:
        return False

如果 char 与栈顶元素不匹配,说明字符串无效。

  return not stack

遍历结束后,如果栈为空,说明所有左括号都已被匹配,因此字符串有效。否则,字符串无效。

实例演练:以题解破难题

假设我们遇到一个输入字符串 s = "()[]{}"

  • 遍历第一个字符 ("",将左括号压入栈中。
  • 遍历第二个字符 (")”,发现栈顶元素与之匹配,弹出栈顶元素。
  • 依此类推,继续遍历剩余的字符,最终栈为空。

根据我们前面提到的判断标准,如果栈为空,则字符串有效。因此,s = "()[]{}" 是一个有效的括号字符串。

总结:刷题进阶之路

通过对 LeetCode 第 20 题的深入探讨,我们不仅掌握了解决有效括号问题的具体方法,更领悟了栈在数据结构中的重要作用。刷题的真谛不在于死记硬背,而在于理解算法背后的原理,将它们融会贯通,应用于解决实际问题。祝愿大家在 LeetCode 的刷题征途中不断进阶,收获技术与思维的双重成长!