思路
和昨天那题一样可以两趟扫描完成。不同的是这题新引入了星号 *,其可以消失(空字符串),也可以充当左括号或者右括号。
从左往右扫描时,和昨天那题一样,我们关注右括号是不是过多了,这个时候的判断标准就是 右括号数量 > 左括号数量 + 星号数量,满足这个条件时肯定无法满足括号闭合。
从右往左扫描的情况依此类推。
代码
class Solution {
public:
bool checkValidString(string s) {
// * 可以弥补一次失配
// 根据 * 和左右括号数量来判断即可
int n=s.size();
int left=0;
int right=0;
int aster=0; // 计数星号数量
for(int i=0;i<n;i++){
if(s[i]=='*'){
aster++;
}else if(s[i]=='('){
left++;
}else{
right++;
}
// 当右括号数量大于左括号加星号数量时就无力回天了
if(right>left+aster){
return false;
}
}
// 倒着再扫描一遍
left=0;
right=0;
aster=0;
for(int i=n-1;i>=0;i--){
if(s[i]=='*'){
aster++;
}else if(s[i]=='('){
left++;
}else{
right++;
}
// 倒着扫描就看有没有左括号大于右括号和星号数量的时候
if(left>right+aster){
return false;
}
}
return true;
}
};