题目

思路
dp[i]表示以下标i结尾的子串形成的有效长度,()()()->dp=6, ()()()(-> dp=0
max即为dp[i]中最大的那个

代码
class Solution {
public int longestValidParentheses(String s) {
int length = s.length();
if (length == 0) return 0;
int[] dp = new int[length];
int max = 0;
for (int i = 0; i < length; i++) {
if (s.charAt(i) == ')') {
if (i - 1 >= 0 && s.charAt(i - 1) == '(') {
if (i == 1) {
dp[i] = 2;
} else {
dp[i] = dp[i - 2] + 2;
}
} else if (i - 1 >= 0 && s.charAt(i - 1) == ')') {
if (i - dp[i - 1] - 1 >= 0 && s.charAt(i - dp[i - 1] - 1) == '(') {
if (i - dp[i - 1] - 1 == 0) {
dp[i] = dp[i - 1] + 2;
} else {
dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2;
}
}
}
}
max = Math.max(max, dp[i]);
}
return max;
}
}