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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章