easy list的第二题是括号验证,最开始我想到的是计数法,比如左括号右括号,然后左右相加模2为0,这样就可以判断出来括号是否匹配了。
这个逻辑很简单,代码如下
public boolean isValid(String s) {
System.out.println(s.length());
if(s.length()<2){
return false;
}
int leftSmallBracket=0, rightSmallBracket=0, leftMidBracket=0, rightMidBracket=0, leftLargeBracket=0, rightLargeBracket=0;
for(int i=s.length()-1;i>=0;i--){
switch(s.charAt(i)) {
case '(':
leftSmallBracket++;
break;
case ')':
rightSmallBracket++;
break;
case '[':
leftMidBracket++;
break;
case ']':
rightMidBracket++;
break;
case '{':
leftLargeBracket++;
break;
case '}':
rightLargeBracket++;
break;
}
}
if(leftSmallBracket!=rightSmallBracket || leftMidBracket!=rightMidBracket || leftLargeBracket!=rightLargeBracket){
return false;
}
return true;
}
但是这个代码在测试用例([])失败了,看起来必须是“严格”匹配也就是只能是()[]这样,所以还是用栈这个数据结构最合适。然后使用栈可以写出如下
public boolean isValid1(String s) {
Stack<Character> stack = new Stack<>();
if(s.length()<2){
return false;
}
for(int i=s.length()-1;i>=0;i--){
char c = s.charAt(i);
if(c==')'||c==']'||c=='}'){
stack.push(c);
}
else if(stack.isEmpty()){
return false;
}else if((stack.peek().equals(')')&&c=='(') || (stack.peek().equals(']')&&c=='[') || (stack.peek().equals('}')&&c=='{')){
stack.pop();
}else{
return false;
}
}
return stack.isEmpty();
}
这个其实也不难,因为严格匹配所以限定的很死,不过最后一个else需要注意,我刚开始没写然后会有一些错误比如([{)这种其实也能通过。