C++ 使用重复字符压缩字符串

C++ 使用重复字符压缩字符串,c++,string,algorithm,compression,C++,String,Algorithm,Compression,我有一个字符串,其中只包含“U”、“D”、“L”、“R”字符(迷宫中的方向) 字符串可能如下所示: RRRRR DRRDDDRRUUUDRRRUULU ddddddddddddddddddddddddddddddddddddl luuurrdrrluuurrdrr 我想压缩这个指令序列 比如说 一,。 压缩前:ULULUL 压缩后:3(UL) 二,。 压缩前:ddddddddddddddddddddddddddl 压缩后:10(DDL) 三,。 压缩前:llllllllllld 压缩后:3(

我有一个字符串,其中只包含“U”、“D”、“L”、“R”字符(迷宫中的方向)

字符串可能如下所示:

  • RRRRR DRRDDDRRUUUDRRRUULU
  • ddddddddddddddddddddddddddddddddddddl
  • luuurrdrrluuurrdrr
我想压缩这个指令序列

比如说

一,。 压缩前:ULULUL 压缩后:3(UL)

二,。 压缩前:ddddddddddddddddddddddddddl 压缩后:10(DDL)

三,。 压缩前:llllllllllld 压缩后:3(4LD)

有人知道这样的算法吗


谢谢

是的,你要找的是经典的(比简单的方法更复杂,只需要重复一个角色)。

是的,你要找的是经典的(比简单的方法更复杂,只需要重复一个角色)。

是的,你要找的是经典的(比简单的方法更复杂,只需要重复单个字符)。

是的,你要找的是经典的(比简单的方法更复杂,只需要重复单个字符)。

不,不要使用游程编码,结果将是可怕的

相反,进行位压缩:将四个方向的每一个编码为2位,然后将四个2位对压缩为一个字节

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

(注:“b”后缀表示二进制,“d”后缀表示十进制。)

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

编辑


从OP的注释可以看出,压缩的结果需要是一个只包含可打印字符的字符串。那么,我想说OP需要的算法被调用了。我不知道有哪种实现会产生可打印的文本(大多数人会发现这样的事情会完全违背压缩的目的),但从理论上讲,以这样一种方式实现算法是可能的,即输出是可打印的字符。无论如何,OP会询问是否有人知道这样的算法,所以,就是这样。

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

相反,进行位压缩:将四个方向的每一个编码为2位,然后将四个2位对压缩为一个字节

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

(注:“b”后缀表示二进制,“d”后缀表示十进制。)

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

编辑


从OP的注释可以看出,压缩的结果需要是一个只包含可打印字符的字符串。那么,我想说OP需要的算法被调用了。我不知道有哪种实现会产生可打印的文本(大多数人会发现这样的事情会完全违背压缩的目的),但从理论上讲,以这样一种方式实现算法是可能的,即输出是可打印的字符。无论如何,OP会询问是否有人知道这样的算法,所以,就是这样。

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

相反,进行位压缩:将四个方向的每一个编码为2位,然后将四个2位对压缩为一个字节

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

(注:“b”后缀表示二进制,“d”后缀表示十进制。)

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

编辑


从OP的注释可以看出,压缩的结果需要是一个只包含可打印字符的字符串。那么,我想说OP需要的算法被调用了。我不知道有哪种实现会产生可打印的文本(大多数人会发现这样的事情会完全违背压缩的目的),但从理论上讲,以这样一种方式实现算法是可能的,即输出是可打印的字符。无论如何,OP会询问是否有人知道这样的算法,所以,就是这样。

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

相反,进行位压缩:将四个方向的每一个编码为2位,然后将四个2位对压缩为一个字节

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

(注:“b”后缀表示二进制,“d”后缀表示十进制。)

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

编辑


从OP的注释可以看出,压缩的结果需要是一个只包含可打印字符的字符串。那么,我想说OP需要的算法被调用了。我不知道有哪种实现会产生可打印的文本(大多数人会发现这样的事情会完全违背压缩的目的),但从理论上讲,以这样一种方式实现算法是可能的,即输出是可打印的字符。无论如何,OP询问是否有人知道这样一种算法,就是这样。

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

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

其思想是逐步完成此正则表达式的非重叠匹配:


(?p(?p.+?)(?:(?p=chars))+)

我创建了一个使用Python正则表达式引擎来提取