使用重复字符压缩字符串

Compressing string with repeating chars

本文关键字:压缩 字符串 字符      更新时间:2023-10-16

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

字符串可能如下所示:

  • RRRRRDRRDDDRRUUUUDDRRRRUULLU
  • DDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDL
  • LUUURRDRRDLUUURRDRRD

我想压缩这一系列指令。

例如。

1.压缩前:ULULUL压缩后:3(UL(

阿拉伯数字。压缩前:DDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDDLDD压缩后:10(DDL(

3.压缩前:LLLLDLLLLDLLD压缩后:3(4LD(

有谁知道这样的算法?

谢谢。

不,不要使用运行长度编码,结果会很糟糕。

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

所以:U = 00b (0d(, D = 01b (1d(,

L = 10b (2d(, R = 11b (3d(。

(注意:"b"后缀表示二进制,"d"后缀表示十进制。

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

编辑

从 OP 的评论中可以看出,压缩的结果需要是一个仅由可打印字符组成的字符串。 所以,那么,我会说OP需要的算法被称为霍夫曼编码(维基百科(。 我不知道有任何产生可打印文本的实现(因为大多数人会发现这样的事情会完全破坏压缩的目的(,但理论上可以以输出是可打印字符的方式实现算法。 无论如何,OP正在询问是否有人知道这样的算法,所以,就是这样。

我创建并撰写了一个解决方案,该解决方案使用Python正则表达式引擎在此处提取重复字符块。

它不会在所有情况下给出最短的答案,但很接近。

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

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

是的,您正在寻找的是经典的运行长度编码(比仅重复单个字符的简单方法更复杂(。