Ihr Algorithmus ist falsch . Ich gehe davon aus, dass Sie wissen, wie man das Suffix-Array und das LCP-Array eines Strings berechnet, das heißt, ihre effiziente Implementierung. Wie in den Kommentaren erwähnt, sollten Sie versuchen zu verstehen, was jede Komponente ist und warum sie funktioniert.
Zuallererst ist das Suffix-Array ( ) einer Zeichenfolge. Ein Suffix-Array besteht im Wesentlichen aus allen Suffixen der Zeichenfolge die in aufsteigender lexikografischer Reihenfolge angeordnet sind. Genauer gesagt, der Wert zeigt an, dass das Suffix von ausgehend von Position rangiert in der lexikographischen Ordnung aller Suffixe von .S S A [ i ] S S A [ i ] i SSASSA[i]SSA[i]iS
Als nächstes kommt das Array. gibt die Länge des längsten gemeinsamen Präfixes zwischen den Suffixen ab und . Das heißt, es verfolgt die Länge des längsten gemeinsamen Präfixes unter zwei aufeinanderfolgenden Suffixen von wenn es in lexikografischer Reihenfolge angeordnet ist.L C P [ i ] S A [ i - 1 ] S A [ i ] SLCPLCP[i]SA[i−1]SA[i]S
Betrachten Sie als Beispiel die Zeichenfolge . Die lexikografisch geordneten Suffixe lauten , also ist für ein 1-indiziertes Array. Das Array wäre .{ a , a b b ein b c a , a b c a , b ein b c a , b b ein b c a , b c a , c a } S A = [ 7 , 1 , 4 , 3 , 2 , 5 ,S=abbabca{a,abbabca,abca,babca,bbabca,bca,ca}L C P L C P = [ - , 1 , 2 , 0 , 1 , 1 , 0 ]SA=[7,1,4,3,2,5,6]LCPLCP=[−,1,2,0,1,1,0]
Wenn wir nun zwei Zeichenfolgen und , verketten wir sie als , wobei ein Zeichen ist, das sowohl in als auch in nicht vorhanden ist . Der Grund für die Auswahl eines solchen Zeichens ist, dass bei der Berechnung des LCP aus zwei Suffixen, z. B. und , der Vergleich am Ende der ersten Zeichenfolge abgebrochen wird (da es nur einmal vorkommt, werden zwei verschiedene Suffixe niemals auftreten) haben Sie es in der gleichen Position), und wird nicht in die andere Zeichenfolge "überlaufen" .B S = A # B # A B a b # d a b d a b dABS=A#B#ABab#dabdabd
Nun ist zu sehen, dass Sie in der Lage sein sollten zu erkennen, warum Sie nur aufeinanderfolgende Werte im Array (das Argument basiert auf Widersprüchen und der Tatsache, dass die Suffixe in in lexikographischer Reihenfolge vorliegen). Überprüfen Sie das Array weiterhin auf den Maximalwert, sodass die beiden verglichenen Suffixe nicht zu derselben ursprünglichen Zeichenfolge gehören. Wenn sie nicht zu derselben ursprünglichen Zeichenfolge gehören (eine beginnt in und die andere in ), ist der größte derartige Wert die Länge der größten gemeinsamen Teilzeichenfolge.S A L C P A BLCPSALCPAB
Als Beispiel betrachten und . Dann ist . Sortierte Suffixe sind . A=abcabcB=bcS=abcabc#bc{abc#bc,abcabc#bc,bc,bc#bc,bcabc#bc,c,c#bc,cabc#bc}
SALCP=[4,1,8,5,2,9,6,3,7]=[−,3,0,2,2,0,1,1,0]
Der größte Wert ist , aber er gilt für und , die beide in der Zeichenfolge . Also ignorieren wir das. Andererseits ist für (entspricht dem Suffix von ) und (entspricht dem Suffix von ). Dies ist also die längste gemeinsame Teilzeichenfolge zwischen den beiden Zeichenfolgen. Für die eigentliche Teilzeichenfolge bekommen Sie eine Länge nehmen (Wert des größten machbar ) String ausgehend von entweder oderS A [ 1 ] S A [ 2 ] Ein L C P [ 4 ] = 2 S A [ 3 ] b c B S A [ 4 ] b c ein b c # b c A 2 L C P S A [ 3 ] S A [LCP[2]=3SA[1]SA[2]ALCP[4]=2SA[3]bcBSA[4]bcabc#bcA2 LCPSA[3]b cSA[4] , die .bc