在 Python 中征服 LeetCode 32:解锁最长有效括号的秘密
2023-11-16 00:47:54
探索 LeetCode 32:“最长有效括号”的奥秘
对于算法和编码的狂热爱好者来说,LeetCode 无疑是一块宝地。其中第 32 题——“最长有效括号”,更是让无数开发者绞尽脑汁。本文将深入探究这道题目的精髓,带你领略算法的魅力。
暴力出击:穷举所有可能
面对看似简单的题目,不少初学者会选择暴力破解。他们会列举所有可能的非空偶数长度的子串,并逐一检查其是否有效。然而,这种方法在面对较长字符串时,效率会随着子串数量的激增而急剧下降。
栈:先入后出的救星
既然暴力破解难以奏效,那么不妨换个思路。括号的成对出现符合栈的数据结构特点,先入后出。我们可以使用栈来记录左括号和右括号的匹配情况。当遇到左括号时,将其入栈;当遇到右括号时,检查栈顶元素是否为左括号,若是,则匹配成功,将其弹出栈。
贪心算法:一步到位
在利用栈巧妙匹配括号的基础上,我们可以进一步优化算法,采用贪心策略。具体步骤如下:
- 设置变量
max_len
记录当前已找到的最长有效括号长度。 - 使用双指针
left
和right
分别指向字符串的开头和结尾。 - 循环移动
right
指针,直到遇到右括号或字符串结尾。 - 若遇到右括号,则将栈顶元素与之匹配。匹配成功则更新
max_len
并移动left
指针到栈顶元素的下一位。 - 若遇到字符串结尾或栈空,则将
left
指针重置为right
指针。 - 重复步骤 2-5,直至遍历完整个字符串。
代码实现
def longest_valid_parentheses(s):
stack = []
max_len = 0
left = 0
for right in range(len(s)):
if s[right] == '(':
stack.append(right)
else:
if stack:
top = stack.pop()
if not stack:
max_len = max(max_len, right - left + 1)
else:
max_len = max(max_len, right - stack[-1])
else:
left = right + 1
return max_len
总结
LeetCode 32 是一道看似简单却暗藏玄机的算法题。通过运用栈和贪心算法,我们可以高效地找到最长有效括号。希望本文能帮助你领悟这道题目的精髓,在算法的海洋中乘风破浪。
常见问题解答
-
为什么使用栈来解决这个问题?
栈的数据结构符合括号的成对出现特点,先入后出的特性可以方便地匹配左括号和右括号。 -
贪心算法的原理是什么?
贪心算法在每次选择时都做出局部最优决策,最终达到全局最优解。在本题中,我们不断更新当前已找到的最长有效括号长度,并根据栈顶元素匹配右括号,贪心地找到局部最优解。 -
代码中如何处理连续的右括号的情况?
当遇到连续的右括号时,栈会不断弹出栈顶元素。如果栈空,则重置left
指针到当前right
指针的位置。 -
如何应对字符串中含有其他字符的情况?
算法只关注左括号和右括号,其他字符不会影响最终结果。 -
如何优化算法的时间复杂度?
可以通过使用动态规划算法进一步优化时间复杂度,从 O(n^2) 降低到 O(n)。