我想做一些“搜索和替换”算法,如果可能的话,它将以有效的方式识别出现多次出现的字符串的子字符串,并用令牌替换所有出现的子字符串。
例如,给定一个字符串“AbcAdAefgAbijkAblmnAbAb”,注意“A”重复出现,所以将第一个减少到“#1bc#1d#1efg#1bijk#1blmn#1b#1b”,其中#_是索引模式(我们注意索引表中的模式),然后注意“#1b”重复,所以减少到“#2c#1d#1efg#2ijk#2lmn#2#2”。字符串中不再出现模式,所以我们已经完成了。
我找到了一些关于“最长公共子序列”和压缩算法的信息,但似乎没有做到这一点。它们要么用于比较两个字符串,要么用于获得某种存储最佳结果。
另一方面,我的目标是将基因组缩减为“单词”而不是“字母”。即,而不是gatcatcgatc我想看到2c1c2c。之后我可以做一些正则表达式来找到像“#42 *#42”这样的东西;在dna中看到重复的括号会很酷。
如果我能在网上找到,我会自己跳过这个问题,但我之前无法看到这个问题。对于那些能指出正确方向的人,非常感谢。
答案 0 :(得分:1)
字节对编码做了一些非常接近你想要的事情。 而不是直接搜索最长的重复字符串(自上而下), 字节对编码的每次传递都搜索重复的字节对(自下而上)。 但最终它发现了最长的重复字符串(*)。
如您所见,它找到了最长的重复字符串“gatc”。
(*)字节对编码最终找到最长的重复字符串, 或者它在制作(2 ^ 8 - uniquechars(source))替换后提前停止。 我怀疑有可能调整字节对编码,以便稍微放松早期停止条件 - 也许(2 ^ 9 - uniquechars(source))或2 ^ 12或2 ^ 16。 即使这会损害压缩性能,也许它会为像你这样的应用程序提供有趣的结果。