关于删除字符串中的重复字符,我正在查看最近的Code Golf . 我仔细考虑过它,并认为RLE算法会解决它,事实上,我确实相信会解决重复问题,我在C中写了一个实现,看看我能走多远
char *rle(const char *src){
char *p=(char *)src;
char *q=(char *)src+1;
char *rle_enc=NULL, *tmp_rle, buf[10];
int run=1;
while (*p){
while(*q){
if (*p==*q++) run++,p++;
}
sprintf(buf,"%d%c",run,*(p-1));
p++;
if (!rle_enc){
if ((rle_enc=malloc(strlen(buf)+1))!=NULL){
strcpy(rle_enc,buf);
}
}else{
if ((tmp_rle=realloc(rle_enc,(strlen(rle_enc)+strlen(buf)+1)))!=NULL){
rle_enc=tmp_rle;
strcat(rle_enc,buf);
}
}
q=(p+1);
run=1;
}
return rle_enc;
}
果然,这是主要的:
int main(int argc, char **argv){
char *test1 = "HHHHHHeeeeeelllllloooooooo";
char *test2 = "nbHHkRvrXbvkn";
char *p = rle(test1);
printf("s = %s\n", test1);
printf("p = %s\n", p);
if (p) free(p);
return 0;
}
根据Code Golf关于meta,它应该是可重用的并且解决一组问题,但是在最短的字符集中,公平地说我认为我对它非常正确,因为这引导我思考RLE算法本身,这里是一个Wikipedia上的页面,关于它的含义以及Java中的实现 .
代码确实看起来正在做它应该做的事情,所以我想,现在,只需要经过 rle 的编码字符串结果,寻找那些后跟字母的那些...
然而,我注意到了RLE算法的局限性,它只适用于那些具有一组彼此相邻的重复字符的人 . 但它没有通过Code Golf的测试案例,看起来看似简单,这让我想到了这个问题:
RLE算法有缺陷吗?现在它会在哪里使用?我认为由于RLE周围的数据和信息流量不再符合目的而产生的灰尘......
Edit: 感谢Moonshadow,John和Steve发布他们的答案 .
有一个基本的教训,我仍然没有学习 - 永远不会去OTT并且在涉及到这种事情时认为复杂,这是我的谬论,并显示了大的思维可以阻碍我的方式,我可以深深地吸入它并且在不看正确的角度的情况下被带走!再次感谢! :)
最好的问候,汤姆 .