Il tuo algoritmo non è corretto . Presumo che tu sappia come calcolare l'array di suffissi e l'array LCP di una stringa, ovvero la loro implementazione efficiente. Come è stato sottolineato nei commenti, dovresti cercare di capire cos'è ogni componente e perché funziona.
Prima di tutto, è l'array di suffissi ( ) di una stringa. Un array di suffissi è fondamentalmente tutti i suffissi della stringa S disposti in ordine lessicografico crescente. Più specificamente, il valore S A [ i ] indica che il suffisso di S a partire dalla posizione S A [ i ] è classificato i nell'ordinamento lessicografico di tutti i suffissi di S .SASSA[i]SSA[i]iS
Il prossimo è l' array L C P [ i ] indica la lunghezza del prefisso comune più lungo tra i suffissi a partire da S A [ i - 1 ] e S A [ i ] . Ossia, tiene traccia della lunghezza del prefisso comune più lungo tra due suffissi consecutivi di S se disposti in ordine lessicografico.LCPLCP[i]SA[i−1]SA[i]S
Ad esempio, considera la stringa . I suffissi in ordine lessicografico sarebbero { a , a b b a b c a , a b c a , b a b c a , b b a b c a , b c a , c a } , quindi S A = [ 7 , 1S=abbabca{a,abbabca,abca,babca,bbabca,bca,ca} per un array 1 indicizzato. L'array L C P sarebbe L C P = [ - , 1 , 2 , 0 , 1 , 1 , 0 ] .SA=[7,1,4,3,2,5,6]LCPLCP=[−,1,2,0,1,1,0]
Ora, data due stringhe e B , li concatenare come S = A # B , dove # è un personaggio non presente in entrambi A e B . Il motivo della scelta di un tale carattere è che, quando si calcola l'LCP di due suffissi, diciamo a b # d a b d e a b d , il confronto si interromperà alla fine della prima stringa (poiché si verifica solo una volta, due diversi suffissi non lo avranno mai nella stessa posizione) e non "overflow" nell'altra stringa.ABS=A#B#ABab#dabdabd
Ora, si può vedere che dovresti essere in grado di vedere perché hai solo bisogno di vedere valori consecutivi nell'array (l'argomento si basa sulla contraddizione e sul fatto che i suffissi in S A sono in ordine lessicografico). Continuare a controllare l' array L C P per il valore massimo in modo tale che i due suffissi confrontati non appartengano alla stessa stringa originale. Se non appartengono alla stessa stringa originale (una inizia in A e l'altra in B ), il valore più grande è la lunghezza della sottostringa comune più grande.LCPSALCPAB
Ad esempio, considera e B = b c . Quindi, S = a b c a b c # b c . I suffissi ordinati sono { a b c # b c , a b c a b c # b c , b c , b c # b c , b c aA=abcabcB=bcS=abcabc#bc . S A{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]
Ora, il massimo valore è , ma è per S A [ 1 ] e S A [ 2 ] , entrambi i quali inizia nella stringa A . Quindi, lo ignoriamo. D'altra parte, L C P [ 4 ] = 2 è per S A [ 3 ] (corrisponde al suffisso b c di B ) e S A [ 4 ]LCP[2]=3SA[1]SA[2]ALCP[4]=2SA[3]bcBSA[4](corrispondente al suffisso di A ). Quindi, questa è la sottostringa comune più lunga tra le due stringhe. Per ottenere la stringa effettiva, si prende una lunghezza 2 (valore della massima realizzabile L C P ) sottostringa partendo da entrambi S A [ 3 ] o S A [ 4 ] , che è b c .bcabc#bcA2 LCPSA[3]SA[4]bc