攻克 LeetCode 20:掌握有效括号的进阶之钥
2023-09-17 00:44:57
【刷穿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 的刷题征途中不断进阶,收获技术与思维的双重成长!