Thuật toán của bạn không chính xác . Tôi giả sử bạn biết cách tính toán mảng hậu tố và mảng LCP của một chuỗi, nghĩa là triển khai hiệu quả của chúng. Như đã được chỉ ra trong các ý kiến, bạn nên cố gắng hiểu từng thành phần là gì và tại sao nó hoạt động.
Trước hết, là mảng hậu tố ( ) của một chuỗi. Một mảng hậu tố về cơ bản là tất cả các hậu tố của chuỗi S được sắp xếp theo thứ tự từ điển tăng dần. Cụ thể hơn, giá trị S A [ i ] chỉ ra rằng hậu tố của S bắt đầu từ vị trí S A [ i ] được xếp hạng iSASSA[i]SSA[i]i trong trật tự tự từ điển của tất cả các hậu tố của .S
Tiếp theo là mảng L C P [ i ] cho biết độ dài của tiền tố chung dài nhất giữa các hậu tố bắt đầu từ S A [ i - 1 ] và S A [ i ] . Đó là, nó theo dõi độ dài của tiền tố chung dài nhất trong số hai hậu tố liên tiếp của S khi được sắp xếp theo thứ tự từ điển.LCPLCP[i]SA[i−1]SA[i]S
Ví dụ, xem xét chuỗi . Các hậu tố theo thứ tự từ vựng sẽ là { 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 } , vì vậy S , 4 , 3 , 2S=abbabca{a,abbabca,abca,babca,bbabca,bca,ca}SA=[7,1,4,3,2,5,6] for a 1-indexed array. The LCP array would be LCP=[−,1,2,0,1,1,0].
Now, given two strings A and B, we concatenate them as S=A#B, where # is a character not present in both A and B. The reason for choosing such a character is so that when computing the LCP of two suffixes, say ab#dabd and abd, the comparison will break off at the end of the first string (since it only occurs once, two different suffixes will never have it in the same position), and won't "overflow" into the other string.
Bây giờ, có thể thấy rằng bạn sẽ có thể thấy lý do tại sao bạn chỉ cần xem các giá trị liên tiếp trong mảng (đối số dựa trên mâu thuẫn và thực tế là các hậu tố trong S A theo thứ tự từ điển). Tiếp tục kiểm tra mảng L C P để tìm giá trị tối đa sao cho hai hậu tố được so sánh không thuộc cùng một chuỗi gốc. Nếu chúng không thuộc cùng một chuỗi gốc (một chuỗi bắt đầu bằng A và chuỗi kia ở B ), thì giá trị lớn nhất như vậy là độ dài của chuỗi con chung lớn nhất.LCPSALCPAB
A=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]
Now, the greatest value is LCP[2]=3, but it is for SA[1] and SA[2], both of which start in the string A. So, we ignore that. On the other hand, LCP[4]=2 is for SA[3] (corresponds to the suffix bc of B) and SA[4] (corresponding to suffix 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.