我正在编写一个程序来查找多个字符串之间最长的公共子字符串。我已经将我的方法降低到使用后缀数组或后缀树。我想看看哪种方法更好(如果有的话)以及为什么。同样对于后缀数组我已经看到了两个字符串的几个算法,但是对于两个字符串不是。任何可靠的例子都将不胜感激,再次感谢您的建议!
注意:我没有看到任何其他专门解决此问题的问题,但如果存在,请指出我的方向!
答案 0 :(得分:1)
如果所有序列中都有子字符串,那么在后缀数组中,指向该子字符串每次出现的指针必须紧密排列在一起。因此,您可以尝试通过沿后缀数组移动窗口来查找它们,其中窗口的大小足以包含每个序列的至少一次出现。您可以通过维护一个表来告知您,在每个序列中,该序列在该窗口中出现的次数,可以在线性时间内完成此操作。然后,当您向前移动窗口的后端时,会减少与您刚刚跳过的指针关联的序列的计数,并且如果需要,将窗口的前端移动到足以获取此序列的新出现的位置并更新表格。
现在,您需要能够找到从窗口中的指针开始的所有子字符串共享的公共前缀的长度。这应该是窗口中指针之间出现的最小LCP值。如果您使用红黑树(例如Java Treeset),其中包含一个由LCP值作为最重要组件的键和一些诸如指针本身作为一个不太重要的组件的连接断路器,那么您可以保持最小值窗口内的LCP值,每个窗口调整的大致日志窗口大小。