Knuth-Morris-Pratt字符串查找算法,简称KMP算法,常用于在一个文本串S中查找一个模式串P出现的位置,因为这个算法有Donald Knuth,Vaughan Pratt,James H.Morris与1977年联合发表,因此取这3个人的姓氏的命名此算法。
int KmpSearch(char *S,char *P)
{
int i = 0,j = 0;
int Slen = strlen(S);
int pLen = strlen(P);
while (i < Slen && j <pLen)
{
if (j == -1 || S[i] == P[i])
{
i++;
j++;
}
else
j = next[j];
}
if (j == pLen)
{
return i-j;
}
else
return -1;
}
通过递推求得next数组,代码如下:
void GetNext(char *P,int next[])
{
int pLen = strlen(P);
next[0] = -1;
int k = -1;
j = 0;
while (j < pLen-1)
{
if (k == -1 || P[k] == P[j])
{//P[k]表示前缀,P[j]表示后缀
k++;
j++;
next[j] = k;
}
else
{
k = next[k];
}
}
}
next数组的优化算法
简单的例子P = "ABAB" S = "ABACABABC"
void GetNext(char *P,int next[])
{
int pLen = strlen(P);
next[0] = -1;
int k = -1;
j = 0;
while (j < pLen)
{
if (k == -1 || P[k] == P[j])
{
k++;
j++;
if (P[j] != P[k])
{
next[j] = k;
}
else{
next[j] = next[k];
}
}
else
{
k = next[k];
}
}
}