用重复的字符压缩字符串

时间:2015-02-14 19:46:26

标签: c++ string algorithm compression

我的字符串只包含'U','D','L','R'字符(迷宫中的方向)。

字符串可能如下所示:

  • RRRRRDRRDDDRRUUUUDDRRRRUULLU
  • DDLDDLDDLDDLDDLDDLDDLDDLDDLDDL
  • LUUURRDRRDLUUURRDRRD

我想压缩这一系列指令。

例如。

1。 压缩之前:ULULUL 压缩后:3(UL)

2。 压缩前:DDLDDLDDLDDLDDLDDLDDLDDLDDLDDL 压缩后:10(DDL)

3。 压缩前:LLLLDLLLLDLLLLD 压缩后:3(4LD)

有谁知道这样的算法?

感谢。

3 个答案:

答案 0 :(得分:2)

不,不要使用行程编码,结果会很糟糕。

相反,进行位打包:用2位编码四个方向中的每个方向,然后将4个2位对打包成一个字节。

所以:U = 00b(0d),D = 01b(1d),L = 10b(2d),R = 11b(3d)。< / p>

(注意:&#39; b&#39;后缀表示二进制,&#39; d&#39;后缀表示十进制。)

因此,LLLL = 10101010b只有1个字节长。

修改

根据OP的评论,结果表明压缩的结果必须是仅包含可打印字符的字符串。那么,我想说OP需要的算法称为Huffman Coding (wikipedia)。我不知道任何产生可打印文本的实现,(因为大多数会发现这样的事情会完全破坏压缩的目的),但理论上可以以输出为可打印字符的方式实现算法。无论如何,OP正在询问是否有人知道这样的算法,那就是它。

答案 1 :(得分:1)

我创建并发布了一个使用Python正则表达式引擎提取重复字符块here的解决方案。

它并没有在所有情况下给出最短的答案,但接近。

我们的想法是逐步完成与此正则表达式的非重叠匹配:

(?P<repeat>(?P<chars>.+?)(?:(?P=chars))+)

答案 2 :(得分:0)

是的,您正在寻找的是经典的run-length-encoding(比简单的方法更复杂,只需要重复个别角色)。