思路:
分解子问题:dp[i]表示以i结尾的最长有效括号。
如果chs[i] = '(' 没有括号可以匹配dp[i] = 0。
如果chs[i] = ')' chs[i - 1] = '(' dp[i] = dp[i - 2] + 2
如果chs[i] = ')' chs[i - 1] = ')' dp[i - 1] > 0 dp[i] = dp[i - 1] + dp[i - 1 - dp[i - 1] - 1] + 2
代码:
class Solution {
public int longestValidParentheses(String s) {
char[] chs = s.toCharArray();
int n = chs.length;
int[] dp = new int[n];
int ans = 0;
for(int i = 1; i < n; i++) {
if(chs[i] == ')') {
if(chs[i - 1] == '(') {
dp[i] = 2;
if(i - 2 >= 0) {
dp[i] += dp[i - 2];
}
}
else if(dp[i - 1] > 0){
if(i - 1 - dp[i - 1] >= 0 && chs[i - 1 - dp[i - 1]] == '(') {
dp[i] = dp[i - 1] + 2;
if(i - 1 - dp[i - 1] - 1 >= 0) {
dp[i] += dp[i - 1 - dp[i - 1] - 1];
}
}
}
}
ans = Math.max(ans, dp[i]);
}
return ans;
}
}
参考: