返回

在 Python 中征服 LeetCode 32:解锁最长有效括号的秘密

见解分享

探索 LeetCode 32:“最长有效括号”的奥秘

对于算法和编码的狂热爱好者来说,LeetCode 无疑是一块宝地。其中第 32 题——“最长有效括号”,更是让无数开发者绞尽脑汁。本文将深入探究这道题目的精髓,带你领略算法的魅力。

暴力出击:穷举所有可能

面对看似简单的题目,不少初学者会选择暴力破解。他们会列举所有可能的非空偶数长度的子串,并逐一检查其是否有效。然而,这种方法在面对较长字符串时,效率会随着子串数量的激增而急剧下降。

栈:先入后出的救星

既然暴力破解难以奏效,那么不妨换个思路。括号的成对出现符合栈的数据结构特点,先入后出。我们可以使用栈来记录左括号和右括号的匹配情况。当遇到左括号时,将其入栈;当遇到右括号时,检查栈顶元素是否为左括号,若是,则匹配成功,将其弹出栈。

贪心算法:一步到位

在利用栈巧妙匹配括号的基础上,我们可以进一步优化算法,采用贪心策略。具体步骤如下:

  1. 设置变量 max_len 记录当前已找到的最长有效括号长度。
  2. 使用双指针 leftright 分别指向字符串的开头和结尾。
  3. 循环移动 right 指针,直到遇到右括号或字符串结尾。
  4. 若遇到右括号,则将栈顶元素与之匹配。匹配成功则更新 max_len 并移动 left 指针到栈顶元素的下一位。
  5. 若遇到字符串结尾或栈空,则将 left 指针重置为 right 指针。
  6. 重复步骤 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 是一道看似简单却暗藏玄机的算法题。通过运用栈和贪心算法,我们可以高效地找到最长有效括号。希望本文能帮助你领悟这道题目的精髓,在算法的海洋中乘风破浪。

常见问题解答

  1. 为什么使用栈来解决这个问题?
    栈的数据结构符合括号的成对出现特点,先入后出的特性可以方便地匹配左括号和右括号。

  2. 贪心算法的原理是什么?
    贪心算法在每次选择时都做出局部最优决策,最终达到全局最优解。在本题中,我们不断更新当前已找到的最长有效括号长度,并根据栈顶元素匹配右括号,贪心地找到局部最优解。

  3. 代码中如何处理连续的右括号的情况?
    当遇到连续的右括号时,栈会不断弹出栈顶元素。如果栈空,则重置 left 指针到当前 right 指针的位置。

  4. 如何应对字符串中含有其他字符的情况?
    算法只关注左括号和右括号,其他字符不会影响最终结果。

  5. 如何优化算法的时间复杂度?
    可以通过使用动态规划算法进一步优化时间复杂度,从 O(n^2) 降低到 O(n)。