一、题目概述
依据给定串,及按键卡住的判定标准,输出可能卡住的按键,及正常输出的串。
按键卡住的判定:若按键卡住,则每次输出都会输出k次。即该按键连续出现的次数一定是k的倍数。
二、思路
字符串以连续的字符段为单位处理时,有一种好用的方式:下标i从1到串尾+1位迭代,每次迭代处理前一位字符(str[i - 1]),可以正确处理到每个字符,不会漏掉易于出错的末尾字符处理。
1、找出肯定没卡住的按键:
for( int i = 1, cnt = 1; i < strlen(str) + 1; ++i )//注意迭代下标范围
if( str[i] != str[i - 1] )//字符不连续时,处理前一位。
{
if( cnt % k )//出现次数不是k的倍数,一定没有卡住。
intact[ str[i - 1] ] = 1;
cnt = 1;
}
else ++cnt;//字符连续时记录连续出现次数
2、输出可能卡住的字符,并生成正常串,即若遇到坏键,删除后面k - 1个重复输出即可。tag[]数组确保坏键只输出一次。
测试点错误测试数据:
(1)
3
eee
答案:
e
e
(2)
3
eeeeee
答案:
e
ee
(3)
3
eeeffff
答案:
e
effff
(4)
3
feeefff
答案:
e
feffff
三、代码
#include <iostream>
#include <string>
using namespace std;
int main()
{
int k, tag[128] = {0};
string str;
cin >> k >> str;
for(int i = 1, cnt = 1; i <= str.size(); ++i)
if(str[i] != str[i - 1])
{
if(cnt % k)
tag[str[i - 1]] = 1;
cnt = 1;
}
else ++cnt;
for(int i = 0; i < str.size(); ++i)
if(!tag[str[i]])
str.erase(i, k - 1);
for(int i = 0; i < str.size(); ++i)
if(!tag[str[i]])
{
tag[str[i]] = 1;
cout << str[i];
}
cout << endl << str;
}