思路:
找出有效括号并且是最长的有效括号
dp[i]表示以i结尾的括号最长是多少
然后从1开始 因为从0位置不管是左括号还是右括号都是无法形成一个完成的括号。所以dp[0]=0;
当i=1时候,判断括号是否是)如果不是那么无法结尾,跳过。如果是的。先找出上一个有效的。代码如下:
class Solution {
public static int longestValidParentheses(String str) {
if (str == null || str.equals("")) {
return 0;
}
char[] chas = str.toCharArray();
int[] dp = new int[chas.length];
int pre = 0;
int res = 0;
for (int i = 1; i < chas.length; i++) {
if (chas[i] == ')') {
// pre是,当前i位置的), 应该找哪个位置的左括号
pre = i - dp[i - 1] - 1;
if (pre >= 0 && chas[pre] == '(') {
dp[i] = dp[i - 1] + 2 + (pre > 0 ? dp[pre - 1] : 0);
}
}
res = Math.max(res, dp[i]);
}
return res;
}
}