编写一个函数void strcompress(char *s),输入一个字符串(只包含小写字母和空格,且长度小于1000),然后采用如下的规则对该字符串当中的每一个字符进行压缩:
(1) 如果该字符是空格,则保留该字符。
(2) 如果该字符是第1次出现或第3次出现或第6次出现,则保留该字符。
(3) 否则,删除该字符。
例如,若用户输入occurrence,经过压缩后,字符c的第2次出现被删除,第1和第3次出现仍保留;字符r和e的第2次出现均被删除,因此最后的结果为:ocurenc。
编写main函数测试该函数的正确性。
输入:
occurrence
输出:
ocurenc
做了一个简单的哈希表记录每个字母的出现情况,用与字符串等长的一个数组记录每个字符向左的偏移量(初值为0),如果当前字符不必删除,就为其赋值为当前偏移量;如果当前字符需要删除,则将偏移量设置为0(待着不动),并且将偏移量+1。最后字符串的原始长度减去偏移量的终值就是经处理的字符串长度,别忘了在后面补\0,这样可以方便地用printf进行输出。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void strcompress(char *s){
int data[200]={0},len=strlen(s),mv=0,*p=(int*)malloc(sizeof(int)*len);
for(int i=0;i<len;i++){
char c=s[i];
if(c==' '||data[c]==0||data[c]==2||data[c]==5)p[i]=mv;
else{
p[i]=0;
mv++;
}
data[c]++;
}
for(int i=0;i<len;i++){
int m=p[i];
s[i-m]=s[i];
}
s[len-mv]='\0';
}
int main(void){
char s[1001],x;int l=0;
while((x=getchar())!='\n')s[l++]=x;s[l]='\0';
strcompress(s);
printf("%s",s);
return 0;
}