苏州品牌网站制作公司,网站开发是在电脑上打出来的资料么,湛江建站程序,天元建设集团有限公司商业承兑汇票拒付最新消息题目翻译#xff1a;
当你用该键盘输入一些句子时#xff0c;与这些键相对应的字符将在屏幕上重复出现 k 次。
现在#xff0c;给定 k 以及最终屏幕显示的结果字符串#xff0c;请你找出所有可能坏掉的按键#xff0c;并给出原始字符串。
例如#xff0c;当 k3 时
当你用该键盘输入一些句子时与这些键相对应的字符将在屏幕上重复出现 k 次。
现在给定 k 以及最终屏幕显示的结果字符串请你找出所有可能坏掉的按键并给出原始字符串。
例如当 k3 时从字符串 thiiis iiisss a teeeeeest我们可以推断出 i 和 e 可能被卡住了因为 i 出现在两个地方都是连续出现 3 次能被 k 乘除而 e 连续出现了 6 次同样也能被 k 整除。但是 s 并没有被卡住因为 thiiis 中 s 只出现了 1 次其长度不能被 k 整除。
所以原始字符串可能是 this isss a teest。
题解思路
我们可以用一个 st 数组来记录每个字符是否被卡住。
首先遍历一遍字符串筛选出没被卡住的字符即字符出现的连续长度不能被 k 整除就没有被卡住而最后剩下没有被筛选出的字符就是被卡住了。
然后再遍历一遍字符串通过上次遍历得到的 st 数组中的结果输出相应被卡住的字符并记录原始字符串的结果然后最后输出。
代码
#includebits/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次可以判断为非坏键