简介
KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯,避免多次比较, 从而使算法效率有了某种程度的提高。
①,初始化KMP ,通过一个数组确定模式串中,p[j]!=t[i] 不相等,next[j] 此刻j回溯到的位置(j=new[j]),然后再次比较,等于-1时候,需要i右移动,概括的说,模式串下次位置的前K个P(0..K-1)等于P(J-K..J-1) ,以此表明前K个已经比较过,相等,不需要回溯到j=0位置。
static void kmp_init(const char *p, int *next, int size) {
if(size<2) //如果只有1个
{
next[0]=-1;
return ;
}
next[0] = -1; //这个是固定的
next[1] = 0;
int k=1;
int i=1;
while(i<(size-1))
{
k=i;
while(1)
{
if(p[i]==p[next[k]])
{
next[++i]=next[k]+1;
break;
}
else //不相等的情况
{
k=next[k];
if(next[k]==-1)
{
next[++i]=0;
break; //直接退出
}
}
}
}
}
int kmp_pattern(char *src ,char *pattern)
{
int pat_size=strlen(pattern);
int src_size=strlen(src);
int *next=(int *)malloc(sizeof(int)*pat_size);
kmp_init(pattern,next,pat_size);
int i,j;
for (i=0,j=0;i<src_size&&j<pat_size;) {
if(src[i]==pattern[j])
{
i++;
j++;
}
else
{
j=next[j];
if(j==-1) //需要i往后移动
{
j=0;
i++;
}
}
}
if(j==pat_size)
{
return (i-pat_size);
}
else
{
return -1;
}
}