我正在查看最近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; }
根据meta上的Code Golf,它应该是可重用的并解决一组问题,但是在最短的字符集中,我认为我只是将变量更改为1个字母并压缩代码把它做得很小..但有些事情并不是很正确,因为这引导我思考RLE算法本身,这是Wikipedia关于它所说的内容和Java实现的页面。
代码似乎正在做它应该做的事情,所以我想,现在,只需要通过rle
的编码字符串结果来查找那些有1后跟字母的字符串。
但是我注意到了RLE算法的局限性,它只适用于那些具有一组彼此相邻的重复字符的人。但它没有通过Code Golf的测试案例,看起来很简单,这让我想到了这个问题:
RLE算法有缺陷吗?现在它会用在哪里?我认为由于RLE周围的数据和信息流量不再符合目的而产生的灰尘......
编辑:感谢Moonshadow,John和Steve发布了他们的答案。
有一个基本的教训,我仍然没有学习 - 当涉及到这种事情时,永远不会去OTT并认为复杂,这对我来说是一种谬论,并表明了思维方式有多么重要而且我可以深深地吸入它并且在没有看到正确的角度的情况下被带走!再次感谢! :)
祝你好运, 汤姆。
答案 0 :(得分:4)
RLE不会为您解决代码高尔夫问题。
代码高尔夫问题要求您去除输入中出现多次的所有字符,无论出现的位置如何。但是,RLE,“运行长度编码”,编码“运行” - 相同字符的重复序列;字符串中可以出现多个相同字符的运行,RLE将按设计单独编码。
RLE旨在通过仅用一个元素替换序列,然后重复它的次数来更紧凑地编码重复数据元素的序列。为此目的,它是完全足够的。任何“缺陷”都不在算法中,而是决定将其用于不适合的目的。
答案 1 :(得分:2)
RLE通常用于8位位图,因为它们通常具有相同字符的长时间运行。 Windows仍然支持以类似方式使用的RLE视频编解码器。如今,LZW + Huffman编码已将RLE取代为“简单”压缩算法。
RLE已经使用多年了,所以我们很难说它是“有缺陷的”,但它肯定效率不高。
大多数RLE格式都有一个“转义字符”,因此输出不会混淆。
例如,如果我们使用“e”作为转义字符......
这会产生一个“e”:
ee
这将是重复两次的字母“a”:
ea2
答案 2 :(得分:1)
为什么你认为它有缺陷? RLE适用于压缩重复字符。它不打算做任何其他事情,并且无法在没有运行长度的情况下压缩数据。 1。
在这个问题的背景下,我会说RLE不是正确的答案,它没有缺陷,在这种情况下它没有帮助。