题解:
class Solution {
public:
bool checkValidString(string s) {
//括号匹配问题
//*处理: *单独入一个栈 使用序号入栈 为处理*(问题
stack<char> st1;
stack<char> st2;
//遍历s
for(int i = 0;i<s.length();i++){
if(s[i] == '('){
//直接入栈
st1.push(i);
}else if(s[i] == ')'){
//右括号 查看st1栈是否为空
if(!st1.empty()){
//不为空 出栈一个左括号
st1.pop();
}else{
//为空 查看st2是否为空
if(!st2.empty()){
//不为空 出栈一个 此时*意为左括号
st2.pop();
}else{
//为空 即st1和st2都为空 无法匹配
return false;
}
}
}else{
//为*
st2.push(i);
}
}
while(!st1.empty()&&!st2.empty()){
//st1和st2不为空 则 使用*代替右括号匹配 但*的序号应该比左括号序号大
if(st1.top()>st2.top()){
return false;
}
//此时 *意为右括号 匹配左括号 各弹出一个符号
st1.pop();
st2.pop();
}
//st1为空 st2不为空 true
//st1和st2都为空 true
if(st1.empty()){
return true;
}
//st1不为空 st2为空 false
return false;
}
};