📌  相关文章
📜  最大有效括号 (1)

📅  最后修改于: 2023-12-03 15:26:26.021000             🧑  作者: Mango

最大有效括号

简介

在计算机科学中,最大有效括号是一个经典的问题。给定一个只包含 '(' 和 ')' 的字符串,找出最长的有效(格式正确且连续)括号子串的长度。

解法

我们可以使用栈来解决这个问题。首先,我们将 -1 放入栈中,表示在字符串开始前没有任何有效的括号。然后,我们遍历整个字符串,当遇到左括号 '(' 时,我们将其下标压入栈中。当遇到右括号 ')' 时,我们弹出栈顶元素并将当前元素下标与元素差值作为可能的答案进行更新。

class Solution:
    def longestValidParentheses(self, 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

时间复杂度:O(n)

空间复杂度:O(n)

动态规划

我们可以使用动态规划来解决这个问题。我们定义一个状态 dp[i] 表示以 i 结尾的最长有效括号子串的长度。当 s[i] 为 '(' 时,对 dp[i] 的更新显然为 0,因为任何以 '(' 结尾的子串都不是有效的。当 s[i] 为 ')' 时,我们考虑 s[i - 1] 是否为 '(' 以及 s[i - dp[i - 1] - 1] 是否为 '(',如果满足两个条件,则有

dp[i] = dp[i - 2] + 2 (i - 2 >=0)

dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2 (i - 2 >=0)

class Solution:
    def longestValidParentheses(self, s: str) -> int:
        n = len(s)
        dp = [0] * n
        max_len = 0
        for i in range(1, n):
            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_len = max(max_len, dp[i])
        return max_len

时间复杂度:O(n)

空间复杂度:O(n)

总结

最大有效括号是一个经典的问题,有多种解法。使用栈或者动态规划都可以解决这个问题。通过解决这个问题,可以帮助我们更好的掌握栈和动态规划的基本思想。