题解
i’m coming~
终于又回来了~
动态规划
难
想不到
dp[i] 表示以第i 个字符为结尾的最长连续的括号长度
如果 s[i] = ‘(’
那么dp[i] = 0
如果 s[i] = ‘)’
那么就需要分情况来判断
如果 s[i - 1] =’(’
那么 dp[i] = dp[i - 2] + 2 这里需要满足 i - 2 >= 0 如果不满足的话那么dp[i] = 2。
如果s[i - 1] = ‘)’
那么需要判断 第 i - dp[i - 1] - 1 这个位置是否为‘(’ ,如果为‘(’那么就和s[i]对称,符合条件,即
dp[i] = dp[i - 1] + 2
然后我们还需要判断之前的是否仍和之后的满足条件。即()(())这种情况
如果满足 那么 dp[i ] = dp[i -1] + 2 + dp[i - dp[i - 1] - 2]]
还需要注意有的索引需要满足 >= 0的情况。
代码
class Solution{
public:
int longestValidParentheses(string s){
int n = s.length();
vector<int>dp(n,0);
int maxn = 0;
for(int i = 1; i < n; i++){
if(s[i] == ')'){
if(s[i - 1] == '('){
dp[i] = 2;
if(i - 2 >= 0){
dp[i] = dp[i - 2] + 2;
}
}else {
if(i - dp[i - 1] - 1 >= 0 && s[i - dp[i-1] - 1] == '('){
dp[i] = dp[i - 1] + 2;
if(i - dp[i-1] - 2 >= 0){
dp[i] = dp[i] + dp[i - dp[i-1] - 2];
}
}
}
}
// cout<<dp[i]<<'\n';
maxn = max(maxn,dp[i]);
}
return maxn;
}
};
欢迎提问~ 欢迎指正~