C++ 使用重复字符压缩字符串
我有一个字符串,其中只包含“U”、“D”、“L”、“R”字符(迷宫中的方向) 字符串可能如下所示: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(
- RRRRR DRRDDDRRUUUDRRRUULU
- ddddddddddddddddddddddddddddddddddddl
- luuurrdrrluuurrdrr
谢谢 是的,你要找的是经典的(比简单的方法更复杂,只需要重复一个角色)。是的,你要找的是经典的(比简单的方法更复杂,只需要重复一个角色)。是的,你要找的是经典的(比简单的方法更复杂,只需要重复单个字符)。是的,你要找的是经典的(比简单的方法更复杂,只需要重复单个字符)。不,不要使用游程编码,结果将是可怕的 相反,进行位压缩:将四个方向的每一个编码为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正则表达式引擎来提取