KMP算法,初学的时候感觉很好理解。但是真正要把实现的代码搞通了,花费了好大的精力。
这是最终的实现代码:
#include <iostream.h>
#include <string.h>
int next[128];
void Get_Next(char *p)
{
for ( int w=0; w<128; w++)
next[w] = 0xefffffff;
int i = 1, j = -1;
next[0] = -1;
int plen = strlen(p);
while (i < plen)
{
if ( j==-1 || p[i] == p[j] ) { i++; j++; next[i] = j;}
else j = next[j];
}
}
int Index_KMP(char *s, char *p, int pos)
{
int i, j;
int slen = strlen(s);
int plen = strlen(p);
i = pos;
j = -1;
while ( i<slen && j<plen )
{
if ( j==-1 || s[i] == p[j] )
{
i++;
j++;
}
else
{
j = next[j];
}
}
if ( j>=plen ) return i-plen;
else return -1;
}
int main(void)
{
char strS[] = "aabcab";
char strP[] = "c";
Get_Next(strP);
int nPos = Index_KMP(strS, strP, 0);
cout<<"The position is:/t"<<nPos<<endl;
return 0;
}
理解这个算法的实现花费了好几天的业余时间。 殷版数据结构书上因为要用面向对象,所以算
法无关代码有一些,初学时候有些妨碍。计算机水平与资格考试的《软件设计师教程》上的算法
好像有错误,就是我在代码中标识的,如果那个j的初始值为0,那么对于单个字符的字符串就会
有错误。
从网上搜索的信息看,好多人都是不能理解next[]的构造,这个也的确是这个算法的难点和关键点
其实殷版数据结构上关于这个讲的挺多的,大家如果能把这个解释认真地看上10遍(我感觉自己就
前后看了10遍多,不是一个时间看的,我比较笨,只能这么学了),再自己把那些结果数据推2遍
(我自己在纸上写了一遍,其实每次看的时候都在脑子里推的),应该是能理解的。
我感觉关键点就是其思想是一个类似归纳法的方法。假设next[j] = k ,这个在 j==0 的时候就是
成立的(此时 k=-1 ),然后由此推出 next[j+1] 等。
要全部写出来挺费事的。