求next[]数组
void comp_next(char *p, int next[])
{
int k = -1,i = 0,m = strlen(p);
next[0] = -1;
while (i < m-1)
{
while (k != -1 && p[k] != p[i])
k = next[k];
i++;
k++;
if (p[i] == p[k])
next[i] = next[k];
else
next[i] = k;
}
}
KMP算法
int find_KMP(char *p, char *s, int *next)
{
int i = 0, j = 0;//从第一个字符开始,i为模式的索引,j为原串的索引
int m = strlen(p), n = strlen(s);
while (i < m && j < n)//模式匹配
{
if (p[i] == s[j])
{
i++;
j++;
}
else//p[i] != p[j]
{
if(next[i] != -1)
i = next[i];
else
{
i = 0;
j++;
}
}
}
if (i >= m)
return j - i + 1;
else
return -1;
}
求Next数组的算法有很多,下面提供几个参考:
http://www.cppblog.com/lzh/archive/2010/11/12/kmp.html
http://www.slyar.com/blog/kmp.html