\quad字符串结合map处理即可。三步走:
- 1、对于输入字符串s,找出所有连续出现次数达到k次的字符,比如k=3,s=caseee1__thiiis_iiisss_a_teeeeeest时得到temp=eiisee
- 2、对于temp中每个字符判断是否重复和是否合法,判断是否重复用map记录字符是否出现过即可。判断字符是否合法即为判断当前字符的每次出现是否都是k次,比如temp中字符s就不合法,因为s的出现并非每次都是连续出现3个s,得到res=ei。
- 3、对于输入的字符串s,逐字符判断是否是坏键所得,打印输出。
#include <iostream>
#include <map>
#include <vector>
using namespace std;
bool isequal(string s)
{
char temp = s[0];
for (int i = 1; i < s.length(); ++i){
if(s[i]!=temp) return false;
}
return true;
}
bool isLegal(string s, char t, int k)
{
for (int i = 0; i < s.length();){
if(t!=s[i]) i++;
else{
string temp = s.substr(i, k);
if(temp.length()!=k) return false;
if(!isequal(temp)) return false;
i += k;
}
}
return true;
}
int main(int argc, char const *argv[])
{
int k; cin >> k; getchar();
string s;
getline(cin, s, '\n');
string temp = "", res = "";
map<char, int> mp;
// 找出所有连续出现次数达到k次的字符,放在temp里面
for (int i = 0; i < s.length();){
string t = s.substr(i, k);
if(isequal(t)) temp+=t[0], i+=k;
else i++;
}
// 对temp里面字符判断合法性并用map去重,将结果放在res里面
for (int i = 0; i < temp.length(); ++i){
if(mp.count(temp[i])==0 && isLegal(s, temp[i], k)) res+=temp[i], mp[temp[i]]=1;
}
cout << res << endl;
int i = 0;
// 逐字符判断是否是坏键打印所得,输出结果
while(i<s.length()){
cout << s[i];
if(mp.count(s[i])==0) i++;
else i += k;
}
return 0;
}