678. 有效的括号字符串
难度:中等
题目描述
解题思路
1、抄的答案
思路好巧妙,反正我自己肯定想不出来
/*
* 678. 有效的括号字符串
* 2020/8/24
*/
public boolean checkValidString(String s) {
int left = 0,right = 0;
//加上*号之后,未匹配左括号的数量从一个值变成了一个范围,用两个变量来记录这个范围的上界和下界
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(c == '(') {
left++;
right++;
}else if(c == '*') {//如果left不为空,说明左括号比较多,*作为右括号
if(left > 0)
left--;
right++;
}else { //如果是右括号
if(left > 0)
left--;
right--;
}
if(right < 0) { //right<0 说明把*当作右括号也不够左括号数量
return false;
}
}
双栈匹配
还是可以用传统括号匹配的方式,用栈模拟
public boolean checkValidString(String s) {
Stack<Integer> left = new Stack<>();
Stack<Integer> star = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(c == '(') {
left.push(i);
}else if(c == '*') {
star.push(i);
}else { //如果是右括号,寻找匹配
if(!left.isEmpty()) {
left.pop();
}else if(!star.isEmpty()) {
star.pop();
}else {
return false;
}
}
}
//处理剩下的,只有左括号下小于※下标才能匹配上
while(!left.isEmpty()) {
if(!star.isEmpty() && left.pop() < star.pop()) {
continue;
}else {
return false;
}
}
return true;
}