アルゴリズムが正しくありません。文字列の接尾辞配列とLCP配列の計算方法、つまり効率的な実装を知っていると思います。コメントで指摘されているように、各コンポーネントが何であり、なぜ機能するのかを理解する必要があります。
まず、文字列の接尾辞配列()です。接尾辞配列は、基本的に、昇順の辞書式順序で配置された文字列Sのすべての接尾辞です。より具体的には、値S A [ I ]でのサフィックスことを示しSが位置からS A [ I ]がランク付けされている私はすべてのサフィックスの辞書式順序でS。SASSA[i]SSA[i]iS
次は配列です。L C P [ i ]は、S A [ i − 1 ]とS A [ i ]から始まるサフィックス間の最長共通プレフィックスの長さを示します。つまり、辞書式順序で配置された場合、Sの 2つの連続するサフィックスの中で最も長い共通プレフィックスの長さを追跡します。LCPLCP[i]SA[i−1]SA[i]S
一例として、文字列を検討。辞書順の接尾辞は{ 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 }なので、S A = [ 7 、1S=abbabca{a,abbabca,abca,babca,bbabca,bca,ca} 1-インデックス配列のために。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]
ここで、2つの文字列とBを指定すると、それらをS = A #Bとして連結します。#はAとBの両方に存在しない文字です。このような文字を選択する理由は、a b #d a b dとa b dの2つの接尾辞のLCPを計算するときに、最初の文字列の終わりで比較が途切れるからです(1回だけ発生するため、 2つの異なる接尾辞が同じ位置にあることはありません)、他の文字列に「オーバーフロー」しません。ABS=A#B#ABab#dabdabd
これで、配列の連続した値のみを表示する必要がある理由を確認できるはずです(引数は矛盾とS Aの接尾辞が辞書式順序であるという事実に基づいています)。チェック保つL C Pの最大値のアレイように比較される2つのサフィックスが同じ元の文字列に属していないが。それらが同じ元の文字列に属さない場合(一方はAで始まり、もう一方はBで始まる)、そのような最大値は最大の共通部分文字列の長さです。LCPSALCPAB
例として、およびB = b cを考えます。次に、S = a b c a b c #b cです。ソートされたサフィックスは{ 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]
現在、最大値はですが、S A [ 1 ]とS A [ 2 ]であり、どちらも文字列Aで始まります。したがって、それは無視します。一方、L C P [ 4 ] = 2はS A [ 3 ](Bの接尾辞b cに対応)およびS A [ 4 ]LCP[2]=3SA[1]SA[2]ALCP[4]=2SA[3]bcBSA[4](Aのサフィックスに対応)。したがって、これは2つの文字列の中で最も長い共通部分文字列です。実際のサブストリングを取得するためには、長さ取る2(最大値の可能L C Pのいずれかから始まるサブストリング)S A [ 3 ]又はS A [ 4 ]であり、B 、C。bcabc#bcA2 LCPSA[3]SA[4]bc