题目描述:
解题思路:
不同于之前做的 valid parenthse,这道题给的字符串还含有特殊字符*,且该字符可以为 ( 或 )。解题思路即为遇到)则用出现过的( 或* 去抵消,对剩下的字符串进行判断。
class Solution {
public:
bool checkValidString(string s) {
vector<char>left;
vector<char>star;
for(int i=0;i<s.size();i++){
if(s[i]=='(')left.push_back(i);
else if(s[i]=='*')star.push_back(i);
else{
if(left.size()>0)left.pop_back();
else if(star.size()>0)star.pop_back();
else return false;
}
}
// 如果剩余的左括号数量大于星号,肯定不符合。
if(left.size()>star.size())return false;
// 左括号右边一定要有一个星号才能合法,因为left和star中存放的是符号在原字符串中出现的位置,所以当star.back()<left.back()时,即表示星号出现在左括号前边,不合法。
for(int i=left.size()-1;i>=0;i--){
if(star.back()<left.back())return false;
else{
left.pop_back();
star.pop_back();
}
}
return true;
}
};