Algoritmanız yanlış . Bir dizenin sonek dizisini ve LCP dizisini, yani etkin uygulamalarını nasıl hesaplayacağınızı bildiğinizi varsayalım. Yorumlarda belirtildiği gibi, her bir bileşenin ne olduğunu ve neden çalıştığını anlamaya çalışmalısınız.
Her şeyden önce, son ek dizisi (bir bir zincir). Bir sonek dizisi temel olarak S dizgesinin artan sözlükbilimsel düzende düzenlenmiş tüm sonekleridir . Daha spesifik olarak, bir değer S A [ I ] arasında eki göstermektedir S konumu itibaren G A [ i ] sıralanır i her soneklerinin lexicographic sıralamada S .SASSA[i]SSA[i]iS
Sıradaki dizisidir. L Cı- p [ i ] uzun ortak uzunluğunu belirten bir önek ile son ekler itibaren G A [ i - 1 ] ve G A [ I ] . Yani, sözlükbilimsel düzende düzenlendiğinde birbirini izleyen iki S soneki arasındaki en uzun ortak önek uzunluğunu izler .LCPLCP[i]SA[i−1]SA[i]S
Örnek olarak, dizesini ele alalım . Sözcükbilimsel sıradaki sonekler { 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 } , yani S A = [ 7 , 1S=abbabca{a,abbabca,abca,babca,bbabca,bca,ca} . L Cı- P bir dizi olacaktır L Cı- p = [ - , 1 , 2 , 0 , 1 , 1SA=[7,1,4,3,2,5,6]LCP .LCP=[−,1,2,0,1,1,0]
Şimdi, iki dizeleri verilen ve B , biz onları bağlamak S = A # B , # hem mevcut değil karakterdir A ve B . Böyle bir karakteri seçmenin nedeni, iki son ekin LCP'sini hesaplarken, örneğin bir b # d a b d ve a b d , karşılaştırma ilk dizenin sonunda kopacaktır (yalnızca bir kez gerçekleştiği için, iki farklı sonek asla aynı konumda olmaz) ve diğer dizeye "taşmaz" .ABS=A#B#ABab#dabdabd
Şimdi, neden sadece dizisinde ardışık değerleri görmeniz gerektiğini görebiliyor olmalısınız (argüman çelişkiye ve S A'daki soneklerin sözlükbilimsel düzende olduğu gerçeğine dayanmaktadır ). Kontrol etmeye devam L Cı- P maksimum değer için bir dizi bu tür iki ekleri karşılaştırılan aynı orijinal dizeye ait değil. Aynı orijinal dizeye ait değilse (biri A'da diğeri B'de başlar ), bu durumda en büyük değer en büyük ortak alt dizenin uzunluğudur.LCPSALCPAB
Örnek olarak ve B = b c'yi düşünün . Sonra S = a b c a b c # b c . Sıralanan sonekler { 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{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]
LCP[2]=3SA[1]SA[2]ALCP[4]=2SA[3]bcBSA[4]bcabc#bc of A). So, this is the longest common substring between the two strings. For getting the actual substring, you take a length 2 (value of the greatest feasible LCP) substring starting from either SA[3] or SA[4], which is bc.