이 문제에 접미사 배열을 사용할 수 있습니다. 여기에는 사전 순으로 정렬 된 문자열의 각 접미사의 시작 위치가 포함됩니다. 그것들은 복잡성으로 순진하게 구성 될 수 있지만 , 복잡성 으로 구성하는 방법이 있습니다. 예를 들어 this 와 this를 참조하십시오 . 이 접미사 배열 SA를 호출하겠습니다.Θ ( N )O ( n 로그n )Θ ( n )
접미사 배열을 구성한 후에는 접미사 배열에 대한 LCP (Longest Common Prefix) 배열을 구성해야합니다. LCP 배열은 접미사 배열에있는 두 개의 연속 접두사 사이의 가장 긴 공통 접두사 길이 (사전 연속 접미사)를 저장합니다. 따라서, LCP [i]는 SA [i]와 SA [i + 1] 사이에서 가장 긴 공통 접두사 길이를 포함합니다. 이 배열은 선형 시간으로 구성 할 수도 있습니다 . 좋은 참조는 here , here 및 here 을 참조하십시오.
이제, 가장 긴 접두사 공통의 길이를 계산하기 위해 어떤 접미사 트리에서 두 접미사 (대신 연속 접미사), 우리는 몇 가지 사용할 필요가 RMQ의 데이터 구조를. 접미사 배열에서 위치 와 ( )를 갖는 두 접미사 사이의 가장 긴 공통 접두사 길이는 위의 참조에 나와 있으며 (배열이 접미사 트리로 시각화 된 경우 쉽게 볼 수 있음) , 로 얻을 수 있습니다 . 좋은 RMQ는 또는 시간으로 배열을 사전 처리하고 에서 형식의 쿼리에 응답 할 수 있습니다.v u < v m i n u < = k < = v − 1 L C P [ k ] L C P O ( n ) O ( n log n ) L C P [ u , v ] O ( 1 )유Vu<vminu<=k<=v−1LCP[k]LCPO(n)O(nlogn)LCP[u,v]O(1)시각. 참조 여기 간결 RMQ 알고리즘에 대한, 그리고 여기 RMQ의에 좋은 튜토리얼 및 LCA와 RMQs 사이의 관계 (및 감소)에 대한. 이것은 또 다른 좋은 대안 접근법이 있습니다.
이 정보를 사용하여 두 문자열 사이에 구분 기호를 사용하여 두 문자열을 연결하기 위해 접미어 배열 및 관련 배열 (위에 설명 된대로)을 구성합니다 (예 : T # P, 여기서 '#'은 두 문자열에서 발생하지 않음). 그런 다음 "kangaroo"방법을 사용하여 k 불일치 문자열 일치를 수행 할 수 있습니다. 이것 과 이것은 접미사 트리의 맥락에서 캥거루 방법을 설명하지만 접미사 배열에도 직접 적용될 수 있습니다. 인덱스마다 텍스트 , 찾기 의 접미사 시작 그리고 접미사 0이 시작은 제 불일치 할 때 매칭 발생 후 위치 부여T L C P T i P P T [ i ] l 0 T P L C P T [ i + l 0 + 1 ] P [ l 0 + 1 ]iTLCPTiPP와 . 이 길이를 . 와 에서 일치하지 않는 문자를 건너 뛰고 나머지 문자열과 일치 시키십시오. 즉, 및 의 를 다시 찾으십시오 . 불일치 또는 문자열 마감 이 나올 때까지이 과정을 반복하십시오 . 각 는 입니다. 각 인덱스 에 대해 가 있으며 , 이는 의 총 복잡성을 제공합니다 .T[i]l0TPLCPT[i+l0+1]P[l0+1]L C P O ( 1 ) O ( k ) L C P i T O ( n k )kLCPO(1)O(k) LCPiTO(nk)
또는 인 경우 의 총 복잡성을 제공하는 RMQ 구현을 더 쉽게 사용 했지만 위에서 설명한 것처럼 수행 할 수 있습니다 . 이 문제에 대한 다른 직접적인 방법이있을 수 있지만 이것은 많은 유사한 문제에 적용될 수있는 강력하고 일반적인 접근법입니다.O ( N K + N 로그 N ) m = O ( 없음 ) O ( N K )O(nk+(n+m)log(n+m))O(nk+nlogn)m=O(n)O(nk)