题目见这里
1). 无重复从前往后输出stucked key(字符仅出现k次)
2). 原字符串每k个连续的stucked key只取1个,输出新的字符串
一共37种字符,主要是下面4个数组的使用
1) f[37]:统计某个字符连续出现的个数,具有时效性
2) f1[37]:统计stucked key连续出现的组数
3) flag[37]:stucked key是否存在
4) out[37]:某个stucked key是否已输出代码如下:
#include <stdio.h>
#define N 1005
int main(){
// freopen("Data.txt","r",stdin);
//0~9,a~z,'_'
int f[37]={0}; //每次出现的个数
int f1[37]={0};//标记stucked key的频度
int out[37]={0}; //标记某个stucked key是否已输出
int flag[37];
int k,n,offset,i;
char test[N],res[N];
scanf("%d",&k);
getchar();
scanf("%s",test);
for(i=0;i<37;i++) flag[i] = 1;
for(i=0;test[i];i++){
if(test[i]>='0' && test[i]<='9') offset = test[i]-'0';
else if(test[i]>='a' && test[i]<='z') offset = test[i]-'a'+10;
else offset = 36;
f[offset] ++;
if(test[i+1]!=test[i]){
if(flag[offset]){
if(f[offset]%k) flag[offset] = 0;//不能整除
else f1[offset] += f[offset]/k;
}
f[offset] = 0;
}
}
n = 0;
for(i=0;test[i];i++){
if(test[i]>='0' && test[i]<='9') offset = test[i]-'0';
else if(test[i]>='a' && test[i]<='z') offset = test[i]-'a'+10;
else offset = 36;
if(flag[offset] && f1[offset]>0){
if(!out[offset]) printf("%c",test[i]);
res[n++] = test[i];
// flag[offset] = 0; //not repeated
f1[offset] --;
out[offset] = 1;
i += (k-1); //忽略后k-1个字符
}
else res[n++] = test[i];
}
res[n] = '\0';
printf("\n%s\n",res);
return 0;
}