我正在查看最近关于删除字符串中重复字符的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运行=1;
而 (*p){
而(*q){
if (*p==*q++) 运行++,p++;
}
sprintf(buf,"%d%c",run,*(p-1));
p++;
如果(!rle_enc){
if ((rle_enc=malloc(strlen(buf)+1))!=NULL){
strcpy(rle_enc,buf);
}
}别的{
if ((tmp_rle=realloc(rle_enc,(strlen(rle_enc)+strlen(buf)+1)))!=NULL){
rle_enc=tmp_rle;
strcat(rle_enc,buf);
}
}
q=(p+1);
运行=1;
}
返回 rle_enc;
}
果然,这是主要的:
int main(int argc, char **argv){
char *test1 = "HHHHHHeeeeeelllllloooooooo";
char *test2 = "nbHHkRvrXbvkn";
字符 *p = rle(test1);
printf("s = %s\n", test1);
printf("p = %s\n", p);
如果(p)免费(p);
返回0;
}
根据元数据上的代码高尔夫,它应该是可重用的并解决了一系列问题,但是在最短的字符集中,足够公平,我想我只是将变量更改为 1 个字母并压缩代码以使其变小。但它有些不对劲,因为这让我想到了 RLE 算法本身,这是维基百科上关于它必须说的内容和 Java 实现的页面。
代码似乎确实在做它应该做的事情,所以我想,现在,这只是通过rle查找那些带有 1 后跟字母的字符串来查看编码字符串结果的问题。
然而,我确实注意到 RLE 算法的局限性,它仅适用于那些具有一组彼此相邻的重复字符的算法。但是它在 Code Golf 的测试用例中失败了,它看起来很简单,这让我想到了这个问题:
RLE 算法有缺陷吗?现在它会用在什么地方?收集灰尘我认为由于数据和信息量在 RLE 周围流动不再适合目的......
编辑:感谢 Moonshadow、John 和 Steve 发布他们的答案。
有一个基本的教训我仍然没有学到 - 永远不要去 OTT 并在谈到这种事情时考虑复杂,这对我来说是一个谬论,并表明思考有多大的障碍,我可以被吸得太深,没有看正确的角度就得意忘形了!!!!!再次感谢!:)
RLE 不会为您解决代码高尔夫问题。
代码高尔夫问题要求您去除在输入中出现多次的所有字符,而不管出现在哪里。然而,RLE,“运行长度编码”,编码“运行”——相同字符的重复序列;同一个字符的多次运行可以出现在一个字符串中,并且 RLE 将按照设计分别对它们进行编码。
RLE 旨在更紧凑地编码重复数据元素的序列,方法是将序列替换为仅一个元素,后跟重复的次数。为此目的,它是完全足够的。任何“缺陷”都不在算法中,而在于将其用于不适合的目的的决定。