这只是最简单的MP算法还可以进行进一步的优化
KMP算法主要难点是对next数组的理解
void getnext(char *s,int *next)//更新next数组
{ int len = strlen(s);
next[0] = 0;next[1] = 0;
int i,j;
for(i = 1;i<len;i++)
{
j = next[i];
while(j!=0&&s[i]!=s[j])j = next[j];//顺着失陪边走,直到可以匹配
next[i+1] = s[i] == s[j]?j+1:0;
}
}
void find(char *T,char *p,int *next)//查找P是不是T的子串
{
int len = strlen(T),m = strlen(p);
int j = 0,i;
for(i = 0;i<len;i++)
{ while(j&&p[j]!=T[i])j = next[j];
if(p[j] == T[i])j++;
if(j == m)printf("%d\n",i-m+1);//找到了返回下标,不是第几个
}
}