使用重复字符压缩字符串
Compressing string with repeating chars
我有只包含'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))+)
是的,您正在寻找的是经典的运行长度编码(比仅重复单个字符的简单方法更复杂(。
- 连接和压缩标准::vector<std::字符串的最佳方法>
- 从我的2d数组中的一列返回的字符串值被压缩为一个字符串(在Mac os上打开Windows txt文件)
- 解压缩附加的压缩字符串
- 如何使用 Zstd 压缩C++字符串?
- 用Zlib解压缩文本字符串
- 可逆字符串压缩 PHP/C++
- 将参数包解压缩到字符串视图中
- 如何在C 中压缩字符串
- 使用 qCompress 使用 GZip 压缩字符串
- C++位操作:如何将char解码/解压缩为int,并显示正确的字符串
- 7zip 字符串/流压缩 PHP/C?存档中没有文件名/日期存储.7z每个字节都很重要
- 使用重复字符压缩字符串
- C++字符串压缩
- 简单的 zlib C++字符串压缩和解压缩
- 在位压缩字符串(C++)
- C++和zlib,有助于压缩字符串
- 用公共部件压缩字符串
- 无法使用sqlite3和C++解压缩从sql表中选择的压缩字符串
- 计算RLE压缩字符串所需的空间
- 使用zlib压缩字符串,命名文档