阅读目录
- 1. 题目
- 2. 解题思路
- 3. 代码实现
1. 题目
2. 解题思路
需要两个栈,一个用来保存左括号所在的位置索引,一个用来保存星号所在的位置索引。
从左往右遍历字符串,如果是左括号或者星号,则将位置索引分别入栈,如果遇到右括号,首先用左括号栈中的左括号进行匹配,没有左括号则使用星号作为左括号来进行匹配,如果二者都为空,匹配失败。
右括号匹配完后,如果还有余下的左括号没有匹配完,那么就需要在左括号右边的星号来作为右括号进行匹配。
最终,左括号也匹配完,那么字符串有效,因为余下的星号可以作为空字符串。
时间复杂度为 O ( n ) O(n) O(n),空间复杂度也为 O ( n ) O(n) O(n)。
3. 代码实现
class Solution {
public:
bool checkValidString(string s) {
stack<int> left_stack;
stack<int> star_stack;
for (size_t i = 0; i < s.size(); ++i) {
if (s[i] == '(') {
left_stack.push(i);
} else if (s[i] == '*') {
star_stack.push(i);
} else if (s[i] == ')') {
if (!left_stack.empty()) {
left_stack.pop();
} else if (!star_stack.empty()) {
star_stack.pop();
} else {
return false;
}
}
}
while (!left_stack.empty() && !star_stack.empty()) {
if (left_stack.top() > star_stack.top()) {
return false;
} else {
left_stack.pop();
star_stack.pop();
}
}
return left_stack.empty();
}
};