Votre algorithme est incorrect . Je suppose que vous savez comment calculer le tableau de suffixes et le tableau LCP d'une chaîne, c'est-à-dire leur mise en œuvre efficace. Comme cela a été souligné dans les commentaires, vous devez essayer de comprendre ce qu'est chaque composant et pourquoi il fonctionne.
Tout d'abord, est le tableau de suffixes ( ) d'une chaîne. Un tableau de suffixes est fondamentalement tous les suffixes de la chaîne S disposés dans l'ordre lexicographique croissant. Plus précisément, la valeur S A [ i ] indique que le suffixe de S à partir de la position S A [ i ] est classé i dans l'ordre lexicographique de tous les suffixes de S .SASSA[i]SSA[i]iS
Vient ensuite le tableau L C P [ i ] indique la longueur du préfixe commun le plus long entre les suffixes à partir de S A [ i - 1 ] et S A [ i ] . C'est-à-dire qu'il garde une trace de la longueur du préfixe commun le plus long parmi deux suffixes consécutifs de S lorsqu'ils sont disposés dans l'ordre lexicographique.LCPLCP[i]SA[i−1]SA[i]S
Par exemple, considérons la chaîne . Les suffixes dans l'ordre lexicographique seraient { 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 } , donc S A = [ 7 , 1S=abbabca{a,abbabca,abca,babca,bbabca,bca,ca} pour un tableau indexé 1. Letableau L C P serait L C P = [ - , 1 , 2 , 0 , 1 , 1 , 0 ] .SA=[7,1,4,3,2,5,6]LCPL CP= [ - , 1 , 2 , 0 , 1 , 1 , 0 ]
Maintenant, étant donné deux chaînes et B , nous les concaténer comme S = A # B , où # est un caractère non présent à la fois A et B . La raison du choix d'un tel caractère est que lors du calcul du LCP de deux suffixes, disons a b # d a b d et a b d , la comparaison s'arrête à la fin de la première chaîne (car elle ne se produit qu'une seule fois, deux suffixes différents ne l'auront jamais dans la même position) et ne "déborderont" pas dans l'autre chaîne.UNEBS= A # B#UNEBab#dabdabd
Maintenant, on peut voir que vous devriez pouvoir voir pourquoi vous n'avez besoin que de voir des valeurs consécutives dans le tableau (l'argument est basé sur la contradiction et le fait que les suffixes dans S A sont dans l'ordre lexicographique). Continuez à vérifier le tableau L C P pour la valeur maximale de sorte que les deux suffixes comparés n'appartiennent pas à la même chaîne d'origine. S'ils n'appartiennent pas à la même chaîne d'origine (l'un commence en A et l'autre en B ), la plus grande valeur est la longueur de la plus grande sous-chaîne commune.LCPSALCPAB
Par exemple, considérons et B = b c . Alors, S = a b c a b c # b c . Les suffixes triés sont { 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 ]
Maintenant, la plus grande valeur est , mais il est à S A [ 1 ] et S A [ 2 ] , les deux qui commencent dans la chaîne A . Donc, nous ignorons cela. En revanche, L C P [ 4 ] = 2 est pour S A [ 3 ] (correspond au suffixe b c de B ) et S A [ 4 ]L CP[ 2 ] = 3SA [ 1 ]SA [ 2 ]UNEL CP[ 4 ] = 2SA [ 3 ]b cBSA [ 4 ](correspondant au suffixe de A ). Il s'agit donc de la sous-chaîne commune la plus longue entre les deux chaînes. Pour obtenir la sous - chaîne réelle, on prend une longueur 2 (valeur de la plus grande possible L C P ) à partir de la sous - chaîne soit S A [ 3 ] ou S A [ 4 ] , qui est b c .b c a b c # b cUNE2 L CPSA [ 3 ]SA [ 4 ]b c