【题目】
1.给定一个str,判断是不是整体有效的括号字符串
2.返回最长的有效括号字串长度
【示例】
public static void main(String[] args) {
String s="()";
System.out.println(isValid(s));//true
s="(()))";
System.out.println(isValid(s));//false
s="()a()";
System.out.println(isValid(s));//false
System.out.println(maxLength("(()())"));//6
}
【代码】
//判断是否是有效的括号字符串
public static boolean isValid(String str){
if(str==null||str.equals("")){
return false;
}
char[] chas=str.toCharArray();
int status=0;
for(int i=0;i<chas.length;i++){
if(chas[i]!='('&&chas[i]!=')'){
return false;//如果遇到非括号字符,false
}
if(chas[i]=='('){
status++;//记录此时(的个数
}
if(chas[i]==')' && --status<0){
return false;//遇到一个)减一个(,如果不够减了,说明此时右括号多于左括号,false
}
}
return status==0;//最后 左右括号数应该同,status应该刚好减成了0
}
//判断是否是有效的括号字符串进阶:返回最长有效字符串长度
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]=='('){//判断chas[pre]和chas[i]能不能配一对括号
dp[i]=dp[i-1]+2+(pre>0?dp[pre-1]:0);
}
}
res=Math.max(res, dp[i]);
}
return res;
}