KMP字符串匹配算法
详情参见《数据结构(c语言版)》严蔚敏著 Page80
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void getnext(int next[], char * string)
{
int i = 1;
int j = 0;
next[1] = 0;
while(i <= string[0])
{
if(j == 0 || string[i] == string[j])
{
i++;
j++;
if(string[i] != string[j]) next[i] = j;
else next[i] = next[j];
}
else
j = next[j];
}
}
int KMP(char * s, char * p, int pos,const int next[])
{
int i = pos;
int j = 1;
while(i <= s[0] && j <= p[0])
{
if(j == 0 || s[i] == p[j])
{
i++;
j++;
}
else
j = next[j];
}
printf("%d\n",j);
if(j > p[0]) return i - p[0];
return -1;
}
int main()
{
char p[10] ={"4aabb"};
char s[9] ={"7aabaabb"};
int next[9];
next[0] = 100;
p[0] = 4;
s[0] = 7;
getnext(next,p);
int i = 0;
for(;i<=p[0];i++) printf("%d ",next[i]);
putchar('\n');
printf("%d\n",KMP(s,p,1,next));
return 0;
}
浙公网安备 33010602011771号