本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1602. 卡住的键盘
原题传送:AcWing 1602. 卡住的键盘
在一个损坏的键盘上,某些键总是被卡住。
因此,当你用该键盘输入一些句子时,与这些键相对应的字符将在屏幕上重复出现 次。
现在,给定 以及最终屏幕显示的结果字符串,请你找出所有可能坏掉的按键,并给出原始字符串。
注意,有些字符可能被重复键入。
每当卡住的按键被按下时,其对应的字符将固定被输出 次。
例如,当 时,从字符串thiiis iiisss a teeeeeest,我们可以推断出i和e可能被卡住了,但是s并没有被卡住,尽管它也重复出现过。
所以,原始字符串可能是this isss a teest。
输入格式
第一行包含整数 。
第二行包含屏幕中显示的结果字符串,字符串中只包含{a-z}, {0-9}, _。
输出格式
按照检测顺序在一行中输出所有可能卡住的按键,每个按键只需输出一次。
第二行输出原始字符串。
数据范围
, 输入字符串非空且长度不超过 , 至少包含一个卡住的按键。
输入样例:
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;
}