首先认为所有键都是好键
在遍历时把所用重复k次的挑出来利用unordered_map来记录(这里用的suspect),是坏键的记为1
用isnotbroken来记录一下谁一定是好键(例如至少一次重复次数少于n),以及我当初怀疑是坏键的其实某一次重复次数少于n,将是好键的记为1
处理完毕后是坏键的标志是suspect为1且isnotbroken为0
然后咱们再遍历一下,边遍历边把坏键放入一个set容器,边输出坏键
最后输出一下就好啦
#include <iostream>
#include <unordered_map>
#include <set>
using namespace std;
unordered_map<char,int> suspect,isnotbroken;
int main(){
string str;
int n;
int lastcharnum=1;
cin>>n>>str;
int i=1;
while(i<str.length()){
while(str[i-1]==str[i]&&i<str.length()){
lastcharnum++;
i++;
}
if(suspect[str[i-1]]==1&&(lastcharnum%n!=0)){
isnotbroken[str[i-1]]=1;
}
if(lastcharnum%n==0){
suspect[str[i-1]]=1;
}else{
isnotbroken[str[i-1]]=1;
}
lastcharnum=1;
i++;
}
set<char> se;
for(int j=0;j<str.length();j++){
if(suspect[str[j]]==1&&isnotbroken[str[j]]==0){
if(se.find(str[j])==se.end()){
printf("%c",str[j]);
se.insert(str[j]);
}
}
}
printf("\n");
for(int j=0;j<str.length();j++){
printf("%c",str[j]);
if(suspect[str[j]]==1&&isnotbroken[str[j]]==0){
j=j+n-1;
}
}
return 0;
}
来源:CSDN
作者:blxl313
链接:https://blog.csdn.net/blxl313/article/details/104268253