动态规划:leetcode 32
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
public int longestValidParentheses(String s) {
//储存最大长度,返回
int max = 0;
//状态数组,数组元素存储当前往前的括号有效的长度
int[] dp = new int[s.length()];
//循环,从第二个元素开始往前搜索解答,把结果储存在状态矩阵中
for (int i = 1; i < s.length(); i++) {
//当当前的符号是 ')' ,这时候的括号往前是有效的,如果是'(',那么这时对应状态数组中存储为0,为无效括号
if (s.charAt(i) == ')') {
//如果前一个符号为'(',那么当前的括号是有效的,最长有效括号长度为其前一个加2
if (s.charAt(i - 1) == '(') {
dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;// 如果i>=2 那这时的dp应该为: dp[i] = dp[i-2] + 2
//如果前一个为')',则需要分情况,
} else if (i - dp[i - 1] - 1 >= 0 && s.charAt(i - dp[i - 1] - 1) == '(') {// 当 (()()) 这种情况出现 )()())
if (i - dp[i - 1] - 2 >= 0) {
dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2];
} else {
dp[i] = dp[i - 1] + 2;
}
}
max = Math.max(max, dp[i]);
}
}
return max;
}