【题解】【AcWing】1602. 卡住的键盘

145 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1602. 卡住的键盘

原题传送:AcWing 1602. 卡住的键盘

在一个损坏的键盘上,某些键总是被卡住。

因此,当你用该键盘输入一些句子时,与这些键相对应的字符将在屏幕上重复出现 kk 次。

现在,给定 kk 以及最终屏幕显示的结果字符串,请你找出所有可能坏掉的按键,并给出原始字符串。

注意,有些字符可能被重复键入。

每当卡住的按键被按下时,其对应的字符将固定被输出 kk 次。

例如,当 k=3k=3 时,从字符串thiiis iiisss a teeeeeest,我们可以推断出ie可能被卡住了,但是s并没有被卡住,尽管它也重复出现过。

所以,原始字符串可能是this isss a teest

输入格式

第一行包含整数 kk

第二行包含屏幕中显示的结果字符串,字符串中只包含{a-z}, {0-9}, _

输出格式

按照检测顺序在一行中输出所有可能卡住的按键,每个按键只需输出一次。

第二行输出原始字符串。

数据范围

2k1002 \le k \le 100 , 输入字符串非空且长度不超过 10001000 , 至少包含一个卡住的按键。

输入样例:

3
caseee1__thiiis_iiisss_a_teeeeeest

输出样例:

ei
case1__this_isss_a_teest

思路:

先找出坏掉的字符,然后遍历输出。

题解:

#include<bits/stdc++.h>

using namespace std;

unordered_map<char, int> mp, st;

int main()
{	
	int k;
	string s;
	
	cin >> k;
	cin.ignore();
	
	getline(cin, s);
	
	for(int i = 0; i < s.length();)
	{
		int j = i + 1;
		while(s[j] == s[j - 1])
		{
			j++;
			if(j - i == k && mp[s[j - 1]] != -1)
			{
				mp[s[j - 1]] = 1;
				break;
			}		
		}
		
		if(j - i != k)
			mp[s[j - 1]] = -1;
		
		i = j;
	}
	
	string res = "";
	for(int i = 0; i < s.length(); i++)
	{
		if(mp[s[i]] == 1)
		{
			res += s[i];
			i += k - 1;
			if(!st[s[i]])
			{
				cout << s[i];
				st[s[i]] = true;	
			}
		}
		else
			res += s[i];
	}
	
	cout << endl << res << endl;
	
	return 0;
}