我的字符串只包含'U','D','L','R'字符(迷宫中的方向)。
字符串可能如下所示:
我想压缩这一系列指令。
例如。
1。 压缩之前:ULULUL 压缩后:3(UL)
2。 压缩前:DDLDDLDDLDDLDDLDDLDDLDDLDDLDDL 压缩后:10(DDL)
3。 压缩前:LLLLDLLLLDLLLLD 压缩后:3(4LD)
有谁知道这样的算法?
感谢。
答案 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(比简单的方法更复杂,只需要重复个别角色)。