Ich suche nach einem effizienten Algorithmus, um das am längsten wiederholte Muster in einer Zeichenfolge zu finden.
Betrachten Sie beispielsweise die folgende Zahlenfolge:
5431428571428571428571428571427623874534
.
Wie Sie sehen können, 142857142857
ist dies das längste Muster, das in dieser Zeichenfolge einige Male (mindestens zweimal) wiederholt wird.
Die wiederholte Zeichenfolge sollte keine Idee enthalten, sondern Brute-Force?
142857
ist es nicht das längste, weil142857142857
es länger ist. Ich denke, Sie sollten die Frage bearbeiten, um zu klären, was Sie unter „wiederholtem Muster“ verstehen.Antworten:
Das Problem ist überraschend nicht trivial. Zunächst zwei Brute-Force-Algorithmen. Ein Quadrat ("wiederholtes Muster") ist durch seine Längeℓ und Position p und benötigt Zeit O ( ℓ ) , um zu verifizieren. Wenn wir alle ℓ und p durchgehen , erhalten wir einen O ( n3) -Algorithmus. Wir können das verbessern, indem wir zuerst ℓ durchlaufen und dann den String mit zwei laufenden Zeigern in einem Abstand von ℓ scannen . Auf diese Weise kann überprüft werden, ob ein Quadrat der Länge 2 ℓ in linearer Zeit existiert, was eine Gesamtlaufzeit von O ergibtO ( n2) .
Kolpakov und Kucherov entwickelten einen Algorithmus zum Finden aller maximalen Wiederholungen in einem Wort in der ZeitO ( n ) [1], und ihr Algorithmus kann verwendet werden, um alle maximalen Quadrate in der Zeit O ( n ) . Eine Wiederholung ist ein Unterwort der Form wkx , wobei k ≥ 2 und x ein geeignetes Präfix von w . Das größte in dieser Wiederholung enthaltene Quadrat ist ( w⌊ k / 2 ⌋)2 . Mit dieser Formel kann man bei allen maximalen Wiederholungen in einem Wort (von denen es nur O ( n ) viele gibt) das größte Quadrat finden.
[1] Kolpakov, R. & Kucherov, G. (1999). Maximale Wiederholungen in einem Wort in linearer Zeit finden . In Foundations of Computer Science, 1999. 40. Jährliches Symposium über (S. 596-604). IEEE.
quelle