이 문제를 해결하기 위해 일반적인 열거는 작동하지 않습니다. 그것의 점근선은 O(t*s)가 될 것입니다. 따라서 하위 문자열 검색 작업에는 KMP(Knuth-Morris-Pratt) 알고리즘을 사용합니다. 이 알고리즘을 구현하기 위해 문자열 접두사 함수가 사용됩니다. 이것은 길이 n (strong>s 길이)의 숫자 배열이며 각 요소는 최대 길이입니다. 접두사와 일치하는 하위 문자열 s의 가장 큰 자체 접미사입니다. 예:
벡터<정수> 접두사_함수(문자열 s) { 정수 n = (정수 ) s.길이(); 벡터<정수>파이(n); for (int i=0; i<n; ++i) for (int k=0; k<=i; ++k) if (s.substr(0,k) == s .substr(i-k+1,k)) pi[i] = k; 리턴파이; }
s
t
1000 ms 256 Mb Rules for program design and list of errors in automatic problem checking