题目描述:
Given a string containing only three types of characters: '(', ')' and '*', write a function to check whether this string is valid. We define the validity of a string by these rules:
1. Any left parenthesis '(' must have a corresponding right parenthesis ')'.
2. Any right parenthesis ')' must have a corresponding left parenthesis '('.
3. Left parenthesis '(' must go before the corresponding right parenthesis ')'.
4. '*' could be treated as a single right parenthesis ')' or a single left parenthesis '(' or an empty string.
5. An empty string is also valid.
Example 1:
Input: "()"
Output: True
Example 2:
Input: "(*)"
Output: True
Example 3:
Input: "(*))"
Output: True
Note: The string size will be in the range [1, 100].
class Solution {
public:
bool checkValidString(string s) {
stack<int> star; // 保存星号出现的下标
stack<int> left; // 保存左括号出现的下标
for(int i=0;i<s.size();i++)
{
if(s[i]=='*') star.push(i);
else if(s[i]=='(') left.push(i);
else
{
//'*'可以表示空字符串,所以尽量用右括号消除左括号,保留星号
if(left.size()>0) left.pop();
else if(star.size()>0) star.pop();
else return false;
}
}
while(!left.empty()&&!star.empty())
{
if(left.top()>star.top()) return false; // 只有星号的下标大于左括号的下标才能消除左括号
else
{
left.pop();
star.pop();
}
}
return left.empty();
}
};