题意
给定字符串,其中某些字符每次出现时必定重复k次,求出这些字符,并将k次改为1次
题解
我认为此题麻烦的地方在于,某个特定的字符偶尔满足重复出现k次的条件
所以我用了最容易想到也是最容易实现的笨办法,利用了二维数组记录每个字符每次出现的次数,然后再进行判断
源码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
vector<int>repeatTimes[300];
vector<char>repeatChar;
int number[300];
bool cmp(int x,int y){
return number[x]<number[y];
}
int main(){
string str;
string res="";
int k,repeat=1;
cin>>k>>str;
int len=str.length();
str+=".";
char pre=',';
memset(number,-1,sizeof(number));
for(int i=0;i<=len;i++){
if(number[str[i]]==-1){
number[str[i]]=i;
}
if(str[i]==str[i+1]){
repeat++;
}else{
repeatTimes[str[i]].push_back(repeat);
repeat=1;
}
pre=str[i];
}
for(int i=0;i<300;i++){
if(repeatTimes[i].size()!=0){
int flag=1;
for(int j=0;j<repeatTimes[i].size();j++){
if(repeatTimes[i][j]%k!=0)
flag=0;
}
if(flag)
repeatChar.push_back((char)i);
}
}
sort(repeatChar.begin(),repeatChar.end(),cmp);
for(int i=0;i<repeatChar.size();i++){
cout<<repeatChar[i];
}
cout<<endl;
for(int i=0;i<len;){
int flag=0;
for(int j=0;j<repeatChar.size();j++){
if(repeatChar[j]==str[i]){
flag=1;
break;
}
}
res+=str[i];
if(flag)
i+=k;
else
i++;
}
cout<<res<<endl;
return 0;
}