一、题目
给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
点击查看原题
难度级别: 困难
二、思路
1)动态规划
将格式正确的连续括号子段简称为 ‘有效段’
,如果要增加有效段的长度,则有'('+有效段+')'
,或 有效段+'()'
,这里'()'
不能在前面,因为从前向后遍历的时候,已经将其添加如有效段中,本题也就是求解有效段最长长度。
使用dp[i]
记忆以s[i]
为结尾的有效段长度,根据上述有效段扩展的条件,就可以一次遍历找到最大有效段
三、代码
1)动态规划
class Solution {
public int longestValidParentheses(String s) {
int[] dp = new int[s.length()];
int ans = 0;
char[] cs = s.toCharArray();
for (int i = 1; i < cs.length; i++) {
if(cs[i] == ')') {
if (cs[i-1] == '(') {
dp[i] = ((i-2) >= 0 ? dp[i-2] : 0) + 2;
} else if (i - dp[i-1] >= 1 && cs[i - dp[i-1] - 1] == '(') {
dp[i] = dp[i-1] + 2 + (((i - dp[i-1]) >= 2) ?dp[i - dp[i-1] - 2] : 0);
}
ans = Math.max(dp[i], ans);
}
}
return ans;
}
}
时间复杂度为O(n)
,空间复杂度为O(n)