模式游程编码

Posted

技术标签:

【中文标题】模式游程编码【英文标题】:Pattern run-length encoding 【发布时间】:2014-09-08 14:42:51 【问题描述】:

我正在尝试找到最简洁的方法来执行基于模式的行程编码。目标是通过分解由几个相同模式组成的子字符串来压缩字符串。

原始字符串:

start3333end

如您所见,有 4 个“3”模式。可以通过将 4 个“3”模式的运行表示为 $43 来压缩此字符串。

我想获取的压缩字符串:

start$43end

我尝试了String.replaceAll(regex, replacement) 方法。我知道myString.replaceAll("\\([^<])\\", "$1") 只能用它的值替换整个模式,但是我找不到如何使用正则表达式检测和计算相同模式运行的长度

使用正则表达式是个好主意还是有其他“更好”的方法来做到这一点?

【问题讨论】:

你不能使用 Pattern 和 Matcher 来获取组数吗? 【参考方案1】:

您可以将java.util.zip.GZIPInputStreamjava.util.zip.GZIPOutputStreamByteArrayInputStreamByteArrayOutputStream 结合使用来gzip/gunzip 您的字符串,这可能比编写自己的压缩算法更好(除非您可以使用有关数据的知识来被压缩)。

【讨论】:

【参考方案2】:

我只是得到如下输出。应该有比这更有效的方法。但希望这会对你有所帮助

    String s = "start3333end";
    String pString = "\\3\\";
    Pattern p = Pattern.compile(pString);
    Matcher m = p.matcher(s);

    int count = 0;
    while (m.find()) 
        count++;
    
    System.out.println(s.replaceAll(pString, "-").replaceFirst("-"+count+"", "\\$"+count+pString));

【讨论】:

这应该是一个很好的起点,感谢您的帮助!

以上是关于模式游程编码的主要内容,如果未能解决你的问题,请参考以下文章

游程编码问题

算法科普:有趣的游程编码

求:C语言的游程编码,要求将大量的二进制的数据压缩

算法题:RLE压缩算法(游程编码)的Java实现

算法题:RLE压缩算法(游程编码)的Java实现

二值信息隐藏(分块和游程编码实现)