字符串包含三种类型:(,)和*.左括号和右括号要相互对应,并且每一个对应的左括号要在右括号之前。星号可以作为左括号、右括号或者空字符串都行。
解决方法:
- 运用两个栈,一个存储左括号的下标,一个存储星号下标。当遇到右括号时,出栈一个左括号或者星号,当两个栈都为空时,返回false。
- 最后在循环中依次出栈两个栈,如果左括号的栈顶值比星号大,那就返回false。
- 最后如果左括号栈不为空,返回false
- 其他情况返回true
代码如下:
public boolean checkValidString(String s) {
Stack<Integer> left = new Stack<>();
Stack<Integer> star = new Stack<>();
for(int i=0;i<s.length();i++){
char ch = s.charAt(i);
if(ch == '('){
left.push(i);
}else if(ch == '*'){
star.push(i);
}else{
if(!left.isEmpty()){
left.pop();
}else if(!star.isEmpty()){
star.pop();
}else{
return false;
}
}
}
while(!left.isEmpty() && !star.isEmpty()){
if(left.pop() > star.pop()){
return false;
}
}
return left.isEmpty();
}