输入一串括号,例如:‘()()((()))))’,求最长的有效括号的长度是多少?
- 思路:
- 1.动态规划.
- 2.当前如果是有括号 ‘)’ 所在的位置是否有效,跟前面的是否有左括号匹配有关系.
- 3.下标为0的位置是开始位置,无论左括号还是右括号,默认
dp[0] = 0. - 4.如果当前是右括号,就要寻找与他匹配的左括号.
- 5.如果找到了与之匹配的左括号,那么长度最起码是2
- 6.当前右括号和找到的匹配的左括号之间可能还有有效的括号dp[i- 1],累加起来
- 7.然后再加上找到的左括号前面紧邻近的有效的括号,累加起来,才能算最长的有效括号
package com.suanfa.lxm;
public class Code_1_validParenthesis {
public static void main(String[] args) {
String s = "()()((()))))";
System.out.println(maxLength(s));
}
// 有效的括号长度
public static int maxLength(String s) {
if(s == null || s.equals("")) {
return 0;
}
char[] str = s.toCharArray();
//System.out.println(str[0]);
int[] dp = new int[str.length];
int pre = 0;
int ans = 0;
// dp[0] = 0 // 默认是0 可以不写 所以循环从1开始
for (int i = 1; i < str.length; i++) {
if(str[i] == ')') {
pre = i - 1 - dp[i - 1];// 与str[i]配对的左括号的位置 pre
if(pre >= 0 && str[pre] == '(') {
dp[i] = 2+ dp[i - 1]+(pre > 0 ? dp[pre - 1] : 0);
// 找到与之匹配的左括号,长度至少为2,
// dp[i-1]是两个括号之间的有效括号
// dp[pre - 1]找到的匹配的左括号前面的有效括号长度
// 三个累加起来就是最长括号了
}
ans = Math.max(ans, dp[i]);
}
}
return ans;
}
}