int *findNext(char *p)
{
int i = 0;
int k = -1;
int m = strlen(p);
if (m <= 0)
return NULL;
int *next = new int[m];
next[0] = -1;
while (i < m)
{
while (k >= 0 && p[i] != p[k])
k = next[k];
i++;
k++;
if (i == m)
break;
if (p[i] == p[k])
next[i] = next[k];
else
next[i] = k;
}
return next;
}
上面为优化版next数组求法
int KMPStrMatching(char *T,char *P,int *N,int tLen,int pLen)
{
int i = 0;
int j = 0;
if (tLen < pLen)
return -1;
while (i < pLen && j < tLen)
{
if (i == -1 || T[j] == P[i])
{
i++;
j++;
}
else
i = N[i];
}
if (i >= pLen)
return (j - pLen + 1);
else
return -1;
}