NOIP模拟赛 字符串 双端队列 | 栈

字符串

时间限制: 1 Sec 内存限制: 256 MB

题目描述

现在给一个字符串,你要做的就是当这个字符串中存在两个挨着的字符是相同的时就将这两个字符消除。需要注意的是,当把这两个字符消除后,可能又产生一对新的挨着的字符是相同的。比如,初始的字符串是abcddc,dd是两个挨着的相同的字符,当把"dd"消除后,得到的字符串是abcc,这时cc又是两个挨着的相同的字符,所以又应该把cc消除。重复以上操作直到剩下的串中不存在两个挨着的字符是相同的为止,输出最终剩下的串。另需要注意的是,多对相同字符的消除顺序是不会对答案产生影响的,可以证明最后他们都会达到唯一的结果,比如,对于初始字符串adccdeed,无论是adccdeed->addeed->aeed->ad还是adccdeed->adccdd->adcc->ad,最终的输出结果都是ad。

输入

输入的第一行,包含一个字符串,为初始字符串,所有的字符均为小写字母。

输出

输出为一行,包含一个字符串,为执行多次消除操作后最终剩下的字符串。

样例输入

adccdeed

样例输出

ad

提示

对于100%的数据,字符串的长度在1到200000之间。

解法:双端队列 | 栈

大佬都是用栈或者双向链表做的,但是我栈也不想写,就写个双端队列吧

直接开始枚举每一个字母,如果和双端队列的尾部,相同就弹出,否则就插到队尾

AC代码

#include<iostream>
#include<deque>
#define re register int
using namespace std;
deque<char> q;
string s;
int main() {
	cin>>s;
	for(re i=0;i<s.length();i++) {
		if(q.empty()||q.back()!=s[i]) {
			q.push_back(s[i]);
			continue;
		}
		while(q.size()&&q.back()==s[i]) q.pop_back();
	}
	while(q.size()) {
		cout<<q.front();
		q.pop_front();
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章