MEM是“最大精确匹配”问题的缩写,该问题的目的是找到两个输入字符串之间的所有最大相似子字符串。请注意这个问题与字符串匹配问题(或文本搜索)有点不同,你想在另一个文本中找到给定的字符串。
例如,在以下两个字符串中(使用有限的charcharchers {1,2,3})MEM是“12”和“3312”
STR1: “12233312”
STR2: “123312”
例如,233也是两个输入字符串之间的常见子字符串,但由于还有另一个biger子字符串包含它,我们不认为它是MEM。
有没有人有一些优雅的想法如何解决它。一个非常简单的想法可以是使用搜索算法通过一些快速字符串搜索算法(如Boyer-Moore)查找大字符串中较小字符串的所有可能子字符串。但它似乎不是处理这个问题的有效方法。
答案 0 :(得分:2)
这是线性时间算法。
在str1 + "X" + str2
上构建后缀树,其中'X'
未显示在str1
或str2
中。
某些叶节点对应于以str1
开头的后缀(包含'X'
)。颜色这些红色。将其他颜色涂成蓝色。
使用树根到叶子来标记每个节点,其中字符串的长度来自根。
沿着树叶走到树根,找到同时具有红色后代和蓝色后代的叶子最多的节点。在步骤3中计算的标签是公共子串的长度。
答案 1 :(得分:1)
我找到了我正在寻找这个问题的论文。这个想法类似于一个David Eisenstat mentioined。实际上我不需要连接两个字符串和...,我可以构建第一个字符串的后缀树,然后在previos树上构建第二个字符串的后缀树。这意味着当我遍历前一个树以找到secons字符串的方法时,我可以找到显示共同子字符串的公共路径。
答案 2 :(得分:0)
是的,你可以做到这一点相对简单,它叫做动态编程。 创建一个布尔2D表,第一个维度是str1,第二个维度是str2。将所有常用数字设置为true。完成bollean 2D表后,对角迭代并找到最大计数为真。