1112. Stucked Keyboard 解析

这个题卡了好久..

之前没有理解好题意,卡住的一定是卡N次,如果那个按键有没有重复N次的情况就不算卡住。

我是靠不相同的时候判定重复次数的,这时候会出现一个特例,末尾是连续的。

例如:

3

aaaeee

这个时候末尾没有不相同的了。所以追加了一个单独的判定。

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <set>
#include <map>


using namespace std;

int n;
string s;
queue <char> q;
bool isVis[256];
bool NotStack[256];
bool isAns[256];

int main() {
	cin >> n >> s;
	
	memset(isVis, false, sizeof(isVis));
	memset(NotStack, false, sizeof(NotStack));
	memset(isAns, false, sizeof(isAns));

	int p = 1, pre = 0;
	int times = 1;

	//遍历整个字符串 确定可能的串
	while (p < s.size()) {
		if (s[p] != s[pre]){
			if ((p - pre) % n == 0 && !isVis[int(s[pre])]) {//可能卡住且没有访问过
				q.push(s[pre]);
				isVis[int(s[pre])] = true;
			}
			pre = p;
		}
		if (p == s.size() - 1 && s[p] == s[pre] && (p - pre + 1) == n && !isVis[int(s[pre])]) {//最后一个单独处理
			//例如3 aaaeee最后一个不相同不会判定出来
			q.push(s[pre]);
			isVis[int(s[pre])] = true;
		}
		p++;
	}

	//遍历整个字符串 排除没有卡住的
	p = 1, pre = 0;
	while (p < s.size()) {
		if (s[p] != s[pre]) {
			if ((p - pre) % n != 0) {//没有卡住
				NotStack[int(s[pre])] = true;
			}
			pre = p;
		}
		p++;
	}

	//剔除没有卡住的键
	vector <char> fin;
	while (!q.empty()) {
		if (!NotStack[int(q.front())]) {
			fin.push_back(q.front());
			isAns[int(q.front())] = true;
		}
		q.pop();
	}

	//输出
	for (int i = 0; i < fin.size(); i++) {
		cout << fin[i];
	}
	cout << endl;

	for (int i = 0; i < s.size();i++) {
		cout << s[i];
		if (isAns[int(s[i])]) {
			i = i + n - 1;	
		}
	}

	
	return 0;


}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值