返回

LeetCode 32. Longest Valid Parentheses 用Python解决

后端

栈解法

栈是一种先进先出(First-In-First-Out, FIFO)的数据结构,它非常适合解决括号匹配问题。我们可以使用栈来存储左括号的位置,当遇到右括号时,如果栈不为空,并且栈顶元素是左括号,则弹出栈顶元素,表示一对括号匹配成功。否则,说明括号不匹配,我们就更新最长有效括号的长度。

def longest_valid_parentheses(s):
    stack = []
    max_length = 0

    for i, char in enumerate(s):
        if char == '(':
            stack.append(i)
        else:
            if stack:
                stack.pop()
                if not stack:
                    max_length = max(max_length, i + 1)
                else:
                    max_length = max(max_length, i - stack[-1])

    return max_length

动态规划解法

动态规划是一种自底向上的解决问题的策略,它将大问题分解成一系列小问题,然后逐个解决这些小问题,最终解决大问题。对于最长有效括号问题,我们可以定义一个dp数组,dp[i]表示以第i个字符结尾的最长有效括号的长度。

def longest_valid_parentheses(s):
    dp = [0] * len(s)
    max_length = 0

    for i in range(1, len(s)):
        if s[i] == ')':
            if s[i - 1] == '(':
                dp[i] = dp[i - 2] + 2
            elif i - dp[i - 1] > 0 and s[i - dp[i - 1] - 1] == '(':
                dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2

    max_length = max(dp)
    return max_length

比较

栈解法和动态规划解法各有优缺点。栈解法比较简单,易于理解,但时间复杂度为O(n),空间复杂度为O(n)。动态规划解法的时间复杂度为O(n^2),空间复杂度为O(n),但它可以处理更复杂的情况,例如嵌套括号。

总结

在本文中,我们介绍了如何使用栈和动态规划来解决LeetCode 32:最长有效括号问题。我们比较了这两种方法的优缺点,并讨论了它们的适用场景。希望本文对您有所帮助。