KMP 알고리즘 불일치가 일어난 직전까지 같았던 부분을 활용하여 검색을 진행하는 것입니다. 시간 복잡도는 O(N+M)이 됩니다

개요

접두부, 접미부

첨부파일/algrithm-image02.png 이 때, 절대 접두부나 접미부가 문자열의 전체가 될 수 없습니다.

위의 예제처럼 ABCA의 접두부를 기준으로 생각해 봅시다.

주어진 패턴을 보면 접두부 외에 패턴내에 ABCA가 있는 것을 알 수 있습니다. 이것을 활용하고자 하는 것이 KMP 알고리즘입니다.

이것의 실패 필터를 만들면 다음과 같습니다.

ABCABCAC
-1-1-10123-1

주어진 문자열에서 ABCABCAC가 있는지 찾는 KMP 방식은 다음과 같습니다.

문자열과 패턴을 0번째 인덱스부터 전부 비교합니다. 이 때, 실패 필터와 비교 했을 때 같다면, 나머지 인덱스를 넘기고 해당 인덱스부터 시작합니다.

KMP 알고리즘은 구현이 어려운 개념이니 대체 방안으로 cstring에 strchr(strstr)함수와 int strncmp함수를 사용할 수 있습니다.

사용법은 다음과 같습니다.

char str[] = “BlockDMask”;    

char* ptr = strchr(str, ‘M’); 

if(ptr != NULL)



       printf(“찾는 문자 : %c\n”, *ptr);

       printf(“찾은 후 부터의 문자열 : %s”, ptr);     

}
char str1[] = “BlockDMask”; 

char str2[] = “BlockDMask”;

strncmp(str1, str2, 5); //‘Block” 까지만 검사하므로 0 반환

strncmp(str1, str2, 6);  // D < F 이므로 음수 반환

strncmp(str2, str1, 6);  // F < D 이므로 양수 반환