알고리즘이 잘못되었습니다 . 문자열의 접미사 배열과 LCP 배열, 즉 효율적인 구현을 계산하는 방법을 알고 있다고 가정합니다. 주석에서 지적했듯이 각 구성 요소가 무엇이며 왜 작동하는지 이해해야합니다.
우선, 접미사 배열이다 ( 문자열은). 접미사 배열은 기본적으로 오름차순 사전 식 순서로 배열 된 문자열 S 의 모든 접미사입니다 . 구체적으로는, 값 S [ I ]는 의 접미사 것을 나타낸다 S가 위치부터 S [ I ] 올랐 I를 모두 접미어의 사전 식 순서에서 S .Sㅏ에스SA [ 나는 ]에스에스A [ 나는 ]나는에스
다음은 배열입니다. L C P는 [ I ]는 긴 공통의 길이를 나타내는 프리픽스 사이 접미사 부터 S [ I - 1 ] 과 S [ I ]가 . 즉, 사전 순서로 배열 될 때 S의 두 연속 접미사 중에서 가장 긴 공통 접두사 길이를 추적합니다 .엘C피엘C피[ 나는 ]에스A [ i - 1 ]에스A [ 나는 ]에스
예로서, 문자열 고려 . 사전 순서의 접미어는 { 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 , 1에스=abbabca{ a , a b b a b c a , a b c a , b a b c a , b b a b c a , b ca,ca}1- 인덱스 배열의 경우 , 4 , 3 , 2 , 5 , 6 ] . L C P의 배열 될 L C P = [ - , 1 , 2 , 0 , 1 , 1 , 0 ] .에스A=[7,1,4,3,2,5,6]LCPLCP= [ −,1,2,0,1,1,0]
이제 두 개의 문자열 와 B가 주어지면 S = A # B 로 연결합니다 . 여기서 # 은 A 와 B 모두에없는 문자 입니다. 이러한 문자 선택을위한 이유는 두 접미사 LCP를 계산할 때, 대답이 너무 B의 #은 거라고 B에서 D 와 B의 d는 , 단지 한번 발생하기 때문에, 비교 결과 (제 문자열의 끝에 끊어 것 두 개의 다른 접미사는 같은 위치에 있지 않습니다 .) 다른 문자열로 "오버플로" 되지 않습니다 .ㅏ비S= A # B#ㅏ비a b # da b da b d
이제 배열 에서 연속적인 값만 볼 필요가있는 이유를 알 수 있음을 알 수 있습니다 (인수는 모순과 S A 의 접미어 가 사전 순으로 되어 있다는 사실에 근거합니다 ). 당좌 유지 L C P의 최대 값에 대해 배열 되도록 두 접미사 비교되는 것은 동일한 오리지널 캐릭터에 속하지 않는. 동일한 원래 문자열에 속하지 않는 경우 (하나는 A로 시작 하고 다른 하나는 B에서 ) 가장 큰 공통 부분 문자열의 길이입니다.L C피에스ㅏL C피ㅏ비
예를 들어 및 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 = a b c a b cB = b c에스= a b c a b c # b c . S{ a b c # b c , a b c a b c # b c , b c , b c # b c , b c a b c # b c , c , c # b c , c a b c # b c }
에스ㅏL C피=[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 (최대 값 가능한 L C P 서브 스트링 중 하나에서 시작) S [ 3 ] 또는 S [ 4 ] 이고, (B) (C)를 .bcabc#bcA2 LCPSA[3]SA[4]bc