思路:
只要左括号和右括号匹配成功即可,*既是左括号,又是右括号,那么不妨先让读取字符串中(的数量,就可以读出应该有多少个)要与之配对。设l是这个值,那么x时(和*的值,此后,当读取到一个*时,那么应该要与)配对的(就少一个,当读取到)时,与(配对,那么l就减少1。配对之后,x也会相应减少,在循环遍历字符串的过程中,一旦x<0之后,则说明(多了,就不是有效的了,最终,循环结束之后,l的值应该为0,x>=0即可。
public class EveryTen {
public static void main(String[] args) {
System.out.println(LNG(("(*)))")));
}
public static boolean LNG(String s){
int l=0,x=0;
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='('){
l++;//所读取的要与右括号配对的(数量
x++;//(和*的总数
}
else if(s.charAt(i)=='*'){
if(l>0){
l--;//每读取一个*,参与与右括号配对的(数量就减少一个
}
x++;
}
else{//当读取到右括号时
if(l>0) {
l--;
}
x--;
if (x<0) return false;
}
}
if(l==0) return true;//只要应该与)配对的(全部配对成功,即最后l==0,就是有效数组
else return false;
}
}