public boolean isValid(String s){
char[] chas = s.toCharArray();
int count = 0;
for(int i = 0; i < chas.length; i++){
if(chas[i] != ')' && chas[i] != '('){
return false;
}
if(chas[i] == ')' && -- count < 0){
return false;
}
if(chas[i] == '('){
count ++;
}
}
return count == 0;
}
进阶:已知一个字符串都是由左括号(和右括号)组成,返回最长有效括号子串的长度
如:
(()())
当求dp[5]的时候,看arr[i - 1 - dp[4]]的值,为'(',dp[5] = dp[4] + 2 + 0
值得注意的是:这种情况下:
pre = 2
()(()()) dp[7] = dp[6] + 2 + dp[pre - 1]
根据dp[i-1] 求dp[i]
1. 如果chas[i] == '(', dp[i] = 0
2. 否则
计算pre = i - dp[i-1] - ;
如果chas[pre] == '(': dp[i] = dp[i-1] + 2 + dp[pre-1]
public static int maxLength(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 - dp[i-1] - 1;
if(pre >= 0 && chas[pre] == '('){
dp[i] = 2 + dp[i-1] + (pre > 0 ? dp[pre - 1] : 0);
}
}
res = Math.max(res, dp[i]);
}
return res;
}