Twój algorytm jest niepoprawny . Zakładam, że wiesz, jak obliczyć tablicę sufiksów i tablicę LCP łańcucha, czyli ich efektywną implementację. Jak wskazano w komentarzach, powinieneś spróbować zrozumieć, czym jest każdy składnik i dlaczego działa.
Przede wszystkim jest tablica przyrostków ( S S A [ i ] SSA ) ciągu. Tablica sufiksów to w zasadzie wszystkie sufiksy ciągu ułożone w porządku rosnącym leksykograficznym. Dokładniej, stosunek wskazuje, że przyrostek od pozycji S A [ I ] ma miejsce ISSA[i]SSA[i]i w kolejności leksykograficznym wszystkich przyrostkami z .S
Dalej jest tablica L C P [ i ] wskazuje długość najdłuższego wspólnego prefiksu między sufiksami zaczynając od S A [ i - 1 ] i S A [ i ]LCPLCP[i]SA[i−1]SA[i] . Oznacza to, że śledzi długość najdłuższego wspólnego przedrostka spośród dwóch kolejnych sufiksów gdy są ułożone w kolejności leksykograficznej.S
Jako przykład rozważ ciąg . Sufiksy w porządku leksykograficznym to { a , a b b a b c a , a b c a ,S= a b b a b ca , więc S A{a,abbabca,abca,babca,bbabca,bca,ca} , 0 ] . dla tablicy 1-indeksowanej. Tablica L C P będzie miała postać L C P = [ - , 1 , 2 , 0 , 1 , 1SA=[7,1,4,3,2,5,6]LCPLCP=[−,1,2,0,1,1,0]
Teraz, biorąc pod uwagę dwa ciągi i B , łączymy je jako S = A # BABS=A#B , gdzie to postać nie występuje zarówno A i B . Powodem wyboru takiego znaku jest to, że przy obliczaniu LCP dwóch sufiksów powiedz a b # d a b d a a#ABab#dabd , porównanie będzie zerwać pod koniec pierwszego ciągu (ponieważ występuje tylko raz, dwa różne sufiksy nigdy nie będą miały tej samej pozycji) i nie będą„przelewały się”na drugi ciąg.abd
Teraz można zauważyć, że powinieneś być w stanie zrozumieć, dlaczego wystarczy zobaczyć kolejne wartości w tablicy (argument opiera się na sprzeczności i na tym, że sufiksy w S A są w porządku leksykograficznym). Sprawdzaj tablicę L C P pod kątem maksymalnej wartości, tak aby dwa porównywane sufiksy nie należały do tego samego oryginalnego ciągu. Jeśli nie należą do tego samego oryginalnego łańcucha (jeden zaczyna się w A, a drugi w B ), wówczas największą taką wartością jest długość największego wspólnego podłańcucha.LCPSALCPAB
Jako przykład rozważmy i B = b c . Następnie S = a b c a b c # b c . Posortowane sufiksy to { a bA=abcabcB=bcS=abcabc#bcS 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]
Teraz największą wartość , ale dla S A [ 1 ] i S A [ 2 ] , które to rozpoczęcie w łańcuchu A . Więc to ignorujemy. Z drugiej strony, L C, P [ 4 ] = 2 jest S A [ 3 ] (co odpowiada sufiks b , c z B ) i S A [ 4 ]LCP[2]=3SA[1]SA[2]ALCP[4]=2SA[3]bcBSA[4](odpowiadające przyrostkowi z A ). Jest to więc najdłuższy wspólny podciąg między dwoma łańcuchami. Aby uzyskać rzeczywiste podciąg, bierzesz podciąg o długości 2 (wartość największego możliwego podciągnięcia L C P ) zaczynając od S A [ 3 ] lub S A [ 4 ] , co oznacza b c .bcabc#bcA2 LCPSA[3]SA[4]bc