c# - 重复字符的字符串压缩

标签 c# string compression

我有以下两个字符串。

uncompressed "(A(2),I(10),A,A,A,A(3),R,R,R,R,A,A)"
compressed "(A(2),I(10),3A,A(3),4R,2A)"

忽略格式 A(n) 或 I(n) 中的任何条目,您可以看到,当我们找到任何连续的重复字符时,它会被替换为该位置处的单个条目和计数。

我知道一定有一种优雅的方法来做到这一点,但我不断想出看起来丑陋的嵌套循环。

字符串中的数据来自 ISO8211 文件格式,并标识应用于子字段中的数据的格式。

我确信这可以用一行 linq 来完成,但我没有主意(今晚)。

最佳答案

该技术称为 Run Length Encoding .

这是一个使用 Python 的示例:

from itertools import groupby
uncompressed = "(A(2),I(10),A,A,A,A(3),R,R,R,R,A,A)"
counted = [(k, len(list(g))) for k, g in groupby(uncompressed.split(','))]
compressed = ','.join(k if cnt==1 else str(cnt)+k for k, cnt in counted)

关于c# - 重复字符的字符串压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10376749/

相关文章:

c# - 关闭窗体不会释放内存

java - "text"和新字符串 ("text"有什么区别?

c - 如何为字符串动态分配内存空间并从用户那里获取该字符串?

c - 在C中将字符串拆分为数组

java - 压缩:在Java/Scala中以指定比特率保存JPEG图像

caching - 如何为 Gitlab Pages 启用 GZip 压缩?

c# - 在外国Windows上测试,这可能吗?

c# - 带有 Mono 2.10 的 CaSTLe 动态代理

c# - 如何在 C# 中使用多个列表选择检查 null 条件?

ios - 如何使用 GPUImage 压缩视频