查找字符串中最长的重复模式


9

我正在寻找一种有效的算法来查找字符串中最长的重复模式。

例如,考虑以下数字字符串:

5431428571428571428571428571427623874534

如您所见,142857142857是最长的模式,它在此字符串中重复了两次(至少两次)。

重复的字符串不应该包含任何想法,而应该不是蛮力的?


3
您没有定义“几次”的含义,但是如果“两次”算作“几次”,则142857它不是最长的,因为142857142857更长。我认为您应该编辑问题以阐明“重复模式”的含义。
伊藤刚(Tsuyoshi Ito)

很好的一点。我将更新问题。

8
您是否要求模式的出现彼此不相交?因为如果不是这样,则142857142857仍然不是最长的重复。142857142857142857142发生两次。无论如何,对此类问题的通常答案是“后缀树”。

Answers:


15

问题出乎意料的是微不足道的。首先,两个蛮力算法。方形(“重复模式”)是由它的给定的长度 和位置p,并且需要时间Ø来验证。如果遍历所有p,则获得Øñ3算法。我们可以改进,通过第一循环在,然后在距离两个运行指针扫描串。以这种方式,可以验证是否长度的正方形2在线性时间存在,给出总共运行时间Øñ2

Kolpakov和Kucherov开发了一种算法,用于在时间O n )中找到单词中的所有最大重复 [1],并且它们的算法可用于在时间O n )中找到所有最大平方。甲重复的形式为一个子字瓦特ķ X,其中ķ 2X是一个适当的前缀瓦特。包含在该重复的最大正方形是瓦特ķ / 2 2ØñØñwķXķ2Xwwķ/22。使用此公式,给定单词中的所有最大重复次数(其中只有Øñ),就可以找到最大的平方。


[1] Kolpakov,R.,&Kucherov,G.(1999)。在线性时间内找出单词中的最大重复。在计算机科学基金会,1999年。第40届年度研讨会(pp。596-604)。IEEE。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.