题目:
给定一个由小写字母构成的字符串 s。
如果字符串中存在两个字母相同且相邻,则称它们为相同连续字母对。
我们不希望 s 中存在相同连续字母对。
所以,每当在 s 中发现一个相同连续字母对时,就应当将这对字母从 s 中删除,如果删除某一对后,出现了新的相同连续字母对,则新的对也应当被删除。
总之,最终得到的字符串中不能存在相同连续字母对。
输出最终得到的字符串。
可以证明,不论按何种顺序删除相同连续字母对,最终得到的字符串都是一样的。
输入格式
共一行,一个由小写字母构成的字符串 s。
输出格式
输出最终得到的字符串。
保证结果不为空。
数据范围
前 5 个测试点满足 1≤|s|≤20。
所有测试点满足 1≤|s|≤2×105。
输入样例1:
aabbcddddefggbbaa
输出样例1:
cef
输入样例2:
abcddcef
输出样例2:
abef
输入样例3:
abacabaabacabaa
输出样例3:
a
实现代码:
代码1:
#include<iostream>
#include<unordered_map>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
string str;
cin>>str;
string res;
//实质上是利用栈的思想存储 当进入的元素和res中的最后一个元素相等
//则删除栈中的这个元素 这样一定满足当前元素的前面的元素一定满足不是相同的元素连续的字母对
for(auto c:str){
if(res.size() && res.back()==c) res.pop_back();
else res+=c;
}
cout<<res<<endl;
}
代码2:
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
stack<char> stk;
int main(){
string s;
cin>>s;
//利用栈的性质 当栈不为空且当前的元素和栈顶元素相同时 弹出栈顶元素
for(auto c:s){
if(!stk.empty()&&stk.top()==c) stk.pop();
else stk.push(c);
}
//定义答案
string res;
//将栈中的元素出栈 用res存储下来
while(!stk.empty()){
res+=stk.top();
stk.pop();
}
//注意这里栈的出栈顺序是先入栈的元素后出栈 所以最后的输出结果需要将ans倒序后再输出
reverse(res.begin(),res.end());
cout<<res;
}