Bei einem String , würde Ich mag die längste Wiederholung (mindestens zweimal) Teilfolge zu finden. Das heißt, ich möchte einen String w finden, der eine Teilfolge (muss nicht zusammenhängend sein) von s ist, so dass w = w ' ⋅ w ' . Das heißt, w ist eine Zeichenfolge, deren Hälften zweimal hintereinander erscheinen. Beachten Sie, dass w eine Teilfolge von s ist , aber nicht unbedingt eine Teilzeichenfolge.
Beispiele:
Für 'ababccabdc' ist es 'abcabc', da 'abc' = 'abc' und 'abc' (mindestens) zweimal in 'ababccabdc' vorkommen.
Für 'addbacddabcd' ist eine Option 'dddd', weil 'dd' zweimal erscheint (ich kann nicht denselben Buchstaben mehrmals verwenden, aber hier habe ich 4 'd's, also ist es in Ordnung), aber es ist lebngth 4. Ich kann eine bessere finden von Länge 8: 'abcdabcd', weil 'abcd' eine Teilzeichenfolge von 'addbacddabcd' ist, die zweimal vorkommt.
Ich bin daran interessiert, die am längsten wiederholte Folge zu finden. Dies wird auch als "Finden des längsten / größten Quadrats" bezeichnet, aber ich habe viele Artikel gelesen, in denen ein Quadrat für einen Teilstring und nicht für eine Teilsequenz definiert ist.
Ich kann leicht einen Brute-Force-Algorithmus verwenden, der durch Iteration aller Optionen für einen Haltepunkt in der Zeichenfolge benötigt, und dann habe ich zwei Zeichenfolgen, in denen ich nach der größten / längsten gemeinsamen Teilsequenz suchen werde, aber Bei jeder Prüfung wird O ( n 2 ) unter Verwendung einer dynamischen Programmiertechnik verwendet, sodass die gesamte Zeit O ( n 3 ) beträgt . Ich fand einen effizienteren Algorithmus für die längste gemeinsame Teilsequenz, der O ( n 2) nimmt, daher ist die LaufzeitO(n3).
Ich suche nach einem effizienteren Algorithmus für das am längsten wiederholte Teilsequenzproblem. Vielleicht verschwendet meine Idee, über alle Haltepunkte zu iterieren, zu viel Zeit und kann auf weniger Iterationen reduziert werden. Oder vielleicht kann ein Algorithmus mit einer anderen Einstellung dieses Problem lösen.
Ich habe in vielen Zeitschriften und früheren Fragen gesucht, und die meisten Ergebnisse, die ich gefunden habe, betrafen einen Teilstring und nicht eine Teilsequenz.
Ich habe auch gelesen, dass dies mithilfe von Suffixbäumen möglich ist, aber auch dies war für Teilzeichenfolgen relevant, und ich bin nicht sicher, ob eine solche Idee für die Teilsequenz erweitert werden kann.
$
Antworten:
Hier ist eine dynamische Programmierlösung.
quelle
if
dp[i][j] = dp[i - 1][j - 1] + 1