题目:
/** 栈,有效括号的问题使用栈来解决
* 思路:使用两个栈存储 左括号和星号
* 从左到右遍历字符串。
* 遇到左括号,将下标存到左括号栈。
* 遇到星号,将下标存到星号栈。
* 遇到右括号,左括号栈不为空弹出一个元素,
* 左括号栈为空星号栈不为空,从星号栈弹出一个元素匹配。
* 若都为空返回false。
* 遍历结束,查看这两个栈是否为空。
* 不为空,左括号栈的下标要小于星号栈的下标,否则返回false。
* 若左括号栈为空返回True。不为空返回false。
*
* @auther start
* @create 2023-11-22 9:05
*/
public class L678 {
public boolean checkValidString(String s) {
Deque<Integer> leftStack = new LinkedList<>();
Deque<Integer> asterStack = new LinkedList<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(') {
leftStack.push(i);
} else if (c == '*') {
asterStack.push(i);
} else {
if (!leftStack.isEmpty()) {
leftStack.pop();
} else if (!asterStack.isEmpty()) {
asterStack.pop();
} else {
return false;
}
}
}
while (!leftStack.isEmpty() && !asterStack.isEmpty()) {
int left = leftStack.pop();
int aster = asterStack.pop();
if (left > aster) {
return false;
}
}
return leftStack.isEmpty();
}
}