小编典典

查找字符串中最长的重复序列

algorithm

我需要找到一个字符串中最长的序列,但要注意,该序列必须重复三次或更多次。因此,例如,如果我的字符串是:

fdwaw4helloworldvcdv1c3xcv3xcz1sda21f2sd1ahelloworldgafgfa4564534321fadghelloworld

那么我想返回值“ helloworld ”。

我知道完成此操作的几种方法,但是我面临的问题是实际的字符串非常大,因此我确实在寻找一种可以及时实现的方法。


阅读 230

收藏
2020-07-28

共1个答案

小编典典

这个问题是最长重复子串问题的一个变体,并且存在一个使用后缀树的O(n)时间算法来解决。这个想法(如Wikipedia所建议)是构造后缀树(时间O(n)),用后代数注释树中的所有节点(使用DFS的时间O(n)),然后找到树中具有至少三个后代的最深节点(使用DFS的时间O(n))。该总体算法花费时间O(n)。

就是说,众所周知,后缀树很难构建,因此您可能想在尝试此实现之前找到一个为您实现后缀树的Python库。快速的Google搜索打开了这个库,尽管我不确定这是否是一个很好的实现。

另一种选择是将后缀数组LCP数组结合使用。您可以遍历LCP数组中的相邻元素对,并取每对中的最小值,并存储以此方式找到的最大元素数。这将对应于最长重复至少三次的字符串的长度,然后您可以从那里读取字符串本身。

有几种用于构建后缀数组的简单算法(Manber-Myers算法在时间O(n log
n)上运行,并且不太难编写代码),Kasai的算法在时间O(n)上构建LCP数组,并且相当直接编写代码。

希望这可以帮助!

2020-07-28