// 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;
}
kmp字符匹配算法 c語言
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.