题目来源
题目描述
题目解析
分析数据量
- 时间复杂度最大
O
(
N
∗
l
o
g
N
)
O(N * logN)
O(N∗logN)
栈
- 题目首先可以逆向转换,不断从字符串中删除 abc 加入最后删成空,返回true
- 加入不断遍历这个数组,时间复杂度很高,于是想到了消消乐
- 举例: ab abc c
- 中间abc 消除之后 ,c从后面滑向前面撞击前面ab 再次消除
- 有了这个思路,立马想到 栈
- 一旦遇到c,检测栈顶是不是 b a, 不是就返回false,是就弹出,相当于消消乐了
- 最后检测栈里是不是空就解决了
class Solution {
public:
// s 由字母 'a'、'b' 和 'c' 组成
bool isValid(string s) {
std::stack<char> stk;
for (int i = 0; i < s.size(); ++i) {
if(s[i] == 'a' || s[i] == 'b'){
stk.push(s[i]);
}else{
if(stk.size() < 2){
return false;
}
if(stk.top() != 'b'){
return false;
}
stk.pop();
if(stk.top() != 'a'){
return false;
}
stk.pop();
}
}
return stk.empty();
}
};
暴力超时
class Solution {
public:
// s 由字母 'a'、'b' 和 'c' 组成
bool isValid(string s) {
if(s.empty() || s == "abc"){
return true;
}
int N = s.size();
for (int i = 0; i < N - 2; ++i) {
if(s[i] == 'a' && s[i + 1] == 'b' && s[i + 2] == 'c'){
std::string tmp = s.substr(0, i) + s.substr(i + 3);
if(isValid(tmp)){
return true;
}
}
}
return false;
}
};