📌  相关文章
📜  | |第 32 题(1)

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

题目描述

本题是 LeetCode 中的第 32 题,题目名称为 "最长有效括号",难度为困难。

给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

示例 1:

输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()"

示例 2:

输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()"

解题思路

对于括号问题,一般可以使用栈或者动态规划的方法来解决。

本题可以使用动态规划来解决。

定义一个 dp 数组,其中 dp[i] 表示以 i 结尾的最长有效子串长度。对于每一个遇到的 '(',将其下标入栈;对于每一个遇到的 ')',弹出栈顶,此时有两种情况:

  1. 栈为空,说明之前没有 '(' 与之匹配,以此为结尾的子串无法与其他子串连成更长的有效子串,此时 dp[i] = 0。

  2. 栈不为空,说明当前匹配成功,此时 dp[i] = dp[top-1]+i-top+1,其中 top 为栈顶元素,即此次匹配的左括号 '(' 的下标。

最终结果即为 dp 数组中的最大值。

代码实现如下:

class Solution:
    def longestValidParentheses(self, s: str) -> int:
        n = len(s)
        if n == 0:
            return 0
        dp = [0] * n
        stack = []
        res = 0
        for i in range(n):
            if s[i] == '(':
                stack.append(i)
            elif s[i] == ')':
                if len(stack) == 0:
                    dp[i] = 0
                else:
                    j = stack.pop()
                    if j == 0:
                        dp[i] = i - j + 1
                    else:
                        dp[i] = dp[j - 1] + i - j + 1
                res = max(res, dp[i])
        return res

总结

本题是一道动态规划的练习题,需要灵活运用状态转移方程,在遍历字符串的过程中考虑所有情况,保证算法正确性。在实际应用中,需要注意边界情况的处理,以及代码实现的简洁性和可读性。