1. 题目背景与核心挑战
最长有效括号是力扣平台上经典的热门题目(编号32),也是面试中高频出现的算法考题。这道题看似简单——只需要找出字符串中最长的有效括号子串长度,但实际考察了开发者对动态规划和栈这两种重要算法思想的掌握程度。
我第一次遇到这个问题时,被它的多种解法所吸引。题目要求我们处理由'('和')'组成的字符串,例如"(()"的最长有效子串是"()",长度为2;而")()())"的最长有效子串是"()()",长度为4。看似简单的括号匹配,实则暗藏玄机。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解法一:栈的应用解析
2.1 栈的基本思路
栈是解决括号匹配问题的天然选择。我们可以利用栈来跟踪未匹配的括号索引,通过计算当前索引与栈顶元素的差值来获取有效长度。
具体实现步骤:
- 初始化一个空栈,先将-1压入栈中作为基准
- 遍历字符串:
- 遇到'('时,将其索引压栈
- 遇到')'时,弹出栈顶元素
- 如果栈为空,将当前索引压栈作为新的基准
- 否则,计算当前索引与栈顶元素的差值,更新最大长度
python复制def longestValidParentheses(s: str) -> int:
stack = [-1]
max_len = 0
for i in range(len(s)):
if s[i] == '(':
stack.append(i)
else:
stack.pop()
if not stack:
stack.append(i)
else:
max_len = max(max_len, i - stack[-1])
return max_len
2.2 栈解法的关键点
这个解法的精妙之处在于:
- 初始的-1作为虚拟基准点,处理从字符串开头就是有效括号的情况
- 每次遇到')'时弹出的操作,实际上是在匹配最近的'('
- 栈中存储的是索引而非字符,这使得长度计算成为可能
注意:在实现时容易犯的错误是忘记处理栈为空的情况,这会导致后续计算出现错误。
