📅  最后修改于: 2023-12-03 15:21:24.577000             🧑  作者: Mango
本题是 LeetCode 中的第 32 题,题目名称为 "最长有效括号",难度为困难。
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()"
对于括号问题,一般可以使用栈或者动态规划的方法来解决。
本题可以使用动态规划来解决。
定义一个 dp 数组,其中 dp[i] 表示以 i 结尾的最长有效子串长度。对于每一个遇到的 '(',将其下标入栈;对于每一个遇到的 ')',弹出栈顶,此时有两种情况:
栈为空,说明之前没有 '(' 与之匹配,以此为结尾的子串无法与其他子串连成更长的有效子串,此时 dp[i] = 0。
栈不为空,说明当前匹配成功,此时 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
本题是一道动态规划的练习题,需要灵活运用状态转移方程,在遍历字符串的过程中考虑所有情况,保证算法正确性。在实际应用中,需要注意边界情况的处理,以及代码实现的简洁性和可读性。