#include <iostream>
#include <stack>
#include <string>
using namespace std;
string Duplicates(const string &s) {
stack<char> str;
for(char c:s){
//如果栈空 或者 栈顶元素与要输入的元素不相同 —— 进栈
if(str.empty() || str.top() != c){
str.push(c);
}
else {
str.pop();//重复时把里边进过的的吐出来
}
}
string res;
while (!str.empty()) {
res = str.top() + res;
str.pop();
}
return res.empty() ? "0" : res;//注意最后看字符串是不是空
}
int main() {
string s;
cin >> s;
cout << Duplicates(s) << std::endl;
return 0;
}
注:for(char c : s) 是 C++11 引入的一种新的 for 循环语法,也称为范围 for 循环或者 foreach 循环。它的意思是:对于集合(容器) s 中的每个元素,将其赋值给变量 c,然后执行循环体中的语句。
这里假设集合 s 是一个字符序列(字符串),所以每次循环中 c 都会被赋值为序列中的下一个字符。
std::string s = "Hello, World!";
for (char c : s) {
std::cout << c << ' ';
}
// 输出:H e l l o , W o r l d !
算法基本思想:
- 使用栈来模拟点击消除的过程。
- 遍历字符串中的每个字母,如果当前字母与栈顶字母相同,则将栈顶字母出栈;否则将当前字母入栈。
- 最终栈中剩余的字母即为点击消除后的最终形态。
时间复杂度:
- 遍历字符串需要O(n)的时间复杂度,其中n为字符串的长度。
- 栈的操作(入栈和出栈)的时间复杂度为O(1)。
- 因此,整个算法的时间复杂度为O(n)。
空间复杂度:
- 使用了一个栈来存储字母,栈的最大空间取决于字符串中的相邻相同字母的个数。
- 最坏情况下,字符串中的所有字母都是相邻的相同字母,栈的空间复杂度为O(n)。
- 因此,整个算法的空间复杂度为O(n)。

京公网安备 11010502036488号