// KMP.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "string.h"
/**
* 产生一个数组prefixArray,该数组指明:当pattern直到第i个字符匹配但下一个字符不匹配时,
* pattern应该如何向前移动使得匹配前缀尺寸最大,prefixArray[i]移动后pattern匹配前缀的最大索引
* 这样向前移动个数为i-prefixArray[i]
*/
bool prefixGen(char *pattern,int patternLen,int *prefixArray){
int i;
if(patternLen <= 0)
return false;
prefixArray[0] = -1;
int k = -1;//前一次的匹配前缀的最大索引
for(i=1;i<patternLen;i++){
while (k >= 0 && pattern[k+1] != pattern[i]){
k = prefixArray[k];
}
if (pattern[k+1] == pattern[i]){
k++;
}
prefixArray[i] = k;
}
return true;
}
bool kmp(char *text,int *prefixArray,char *pattern){
int k = -1;//匹配前缀最大索引
for(int i=0;i < strlen(text); i++){
while( k >=0 && pattern[k+1] != text[i]){
k = prefixArray[k];
}
if (pattern[k+1] == text[i]){
k++;
}
if(k == strlen(pattern)-1){
printf("matching at %d offset\n",i-k);
k = prefixArray[k];
}
}
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
char *pattern = "ababaca";
char *text =
"ababaca13r4u09iojklsjkhfkjsjofpfioworeababacawrewfk;,mkjjkcvjxzovioidskababacafkjjvjcxvkoaffiodsfababacaababacaskjvjxcvnjcbvfkjkjfskfksfkjsababacajxvjcxvdjdsfkjfkdsfkababaca";
int *prefix = new int[strlen(pattern)];
//printf("%d\n",strlen(pattern));
prefixGen(pattern,strlen(pattern),prefix);
printf("\n");
for (int i = 0; i<strlen(pattern);i++){
printf("%d ",prefix[i]);
}
printf("\n");
kmp(text,prefix,pattern);
delete [] prefix;
return 0;
}