题目翻译:
当你用该键盘输入一些句子时,与这些键相对应的字符将在屏幕上重复出现 k 次。
现在,给定 k 以及最终屏幕显示的结果字符串,请你找出所有可能坏掉的按键,并给出原始字符串。
例如,当 k=3 时,从字符串 thiiis iiisss a teeeeeest,我们可以推断出 i 和 e 可能被卡住了,因为 i 出现在两个地方,都是连续出现 3 次,能被 k 乘除,而 e 连续出现了 6 次,同样也能被 k 整除。但是 s 并没有被卡住,因为 thiiis 中 s 只出现了 1 次,其长度不能被 k 整除。
所以,原始字符串可能是 this isss a teest。
题解思路:
我们可以用一个 st 数组来记录每个字符是否被卡住。
首先,遍历一遍字符串,筛选出没被卡住的字符,即字符出现的连续长度不能被 k 整除就没有被卡住,而最后剩下没有被筛选出的字符就是被卡住了。
然后再遍历一遍字符串,通过上次遍历得到的 st 数组中的结果输出相应被卡住的字符,并记录原始字符串的结果,然后最后输出。
代码:
#include<bits/stdc++.h>
using namespace std;const int N = 210;
int st[N];int main()
{int k;string str;cin >> k >> str;//先把没卡住的字符筛选出来,剩下的字符就是卡住的for (int i = 0; i < str.size(); i++){int j = i + 1;while (j < str.size() && str[j] == str[i]) j++; //找出连续字符int len = j - i;if (len % k) st[str[i]] = 1; //如果长度不能整除k,则该字符没卡住i = j - 1;}//输出卡住的字符string res = "";for (int i = 0; i < str.size(); i++){if (!st[str[i]]) cout << str[i], st[str[i]] = 2;if (st[str[i]] == 1) res += str[i];else{res += str[i];i += k - 1;}}cout << endl << res << endl;return 0;
}
坑点:
只有当连续出现次数能够被K整除的时候,才认为被卡住:
字符串"1111qqqqq_tqeeee__bpacddddaddddd"输入4的话正确的输出确实是1和e
还有一种情况就是,可能出现一个键先被判断为不是坏键,后被判断为坏键的情况,如下:
输入
4
11111_ass_1111_1111
这里的1不是坏键(因为1一开始就出现5次,可以判断为非坏键)