题目描述
给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则: 任何左括号 ( 必须有相应的右括号 )。 任何右括号 ) 必须有相应的左括号 ( 。 左括号 ( 必须在对应的右括号之前 )。 * 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。 一个空字符串也被视为有效字符串。
Example 1:
输入: “()” 输出: True
Example 2:
输入: “(*)” 输出: True
Example 3:
输入: “(*))” 输出: True
Constraints:
- 字符串大小将在 [1,100] 范围内。
解题思路
- 括号匹配,可采用栈来进行模拟
- 这道题主要有特殊字符,’*‘来表示任意
- 此题需要两个栈,一个是左括号栈,一个是*栈
- 遍历整个字符串,如果是’(‘,左括号入栈
- 如果是’‘,入号栈
- 否则,如果是’)’,查看是否有左括号,如果有,就弹出,查看是否有’*‘,如果有就弹出
- 否则,就直接返回false
- 遍历完最后,可能会出现两个栈不为空的情况,那么需要将栈看作‘)’栈,先观察一下下标,如果左括号的下标大于号的下标,就直接返回false
C++代码
class Solution {
public:
bool checkValidString(string s) {
if(s.size() == 0){
return true;
}
stack<char> lefts;
stack<char> alias;
for(int i = 0; i < s.size(); i++){
if(s[i] == '('){
lefts.push(i);
}else if(s[i] == '*'){
alias.push(i);
}else{
if(!lefts.empty()){
lefts.pop();
}else if(!alias.empty()){
alias.pop();
}else{
return false;
}
}
}
while(!lefts.empty() && !alias.empty()){
int leftIndex = lefts.top();
lefts.pop();
int aliasIndex = alias.top();
alias.pop();
if(leftIndex > aliasIndex){
return false;
}
}
return lefts.empty();
}
};