CF1547B Alphabetical Strings 题解

Content

我们有一个空的字符串,第 \(i\) 次操作我们可以将字母表中第 \(i\) 个字母加入字符串的最前面或最后面。我们称一个长度为 \(n\) 的字符串是合法的,当且仅当这个字符串可以通过执行 \(n\) 次上面的操作得到。现在给定 \(t\) 个字符串,求这些字符串是否合法。

数据范围:\(1\leqslant t\leqslant 10^4\)\(1\leqslant n\leqslant 26\)

Solution

我们不妨弄两个指针,一个左指针,初始时指向第 \(1\) 个字符;另一个右指针,初始时指向第 \(n\) 个字母。每一次比较两个指针所指的字母的字典序,将字典序较大的那一个字母放入一个栈里面,并同时移动将左指针向右移动或者将右指针向左移动。在两个指针指向同一个字母时,顺次拿出栈里面的所有字母并判断是否是按照从 \(\texttt{a}\) 开始的 \(n\) 个字母的顺序拿出来的即可。

Code

int main() {
	MT {
		string s; cin >> s; int n = s.size();
		int l = 0, r = n - 1, fl = 1; stack<char> q;
		for(; l <= r; ) {
			if(s[l] > s[r]) q.push(s[l]), l++;
			else if(s[l] < s[r]) q.push(s[r]), r--;
			else if(l == r) q.push(s[l]), l++;
			else {NO, fl = 0; break;}
		}
		if(!fl) continue;
		int cnt = 0;
		while(!q.empty()) {
			char ch = q.top();
			if(ch != 'a' + cnt) {NO, fl = 0; break;}
			else q.pop(), cnt++;
		}
		if(fl) YES;
	}
	return 0;
}
posted @ 2021-12-15 21:37  Eason_AC  阅读(62)  评论(0)    收藏  举报