KMP算法 完全看不懂唉
虽然按算法书上的算法把代码写出来了 但是无法理解 也不知道怎么记忆这个写法哎
有谁能推荐下记住这个算法的写法的方法么
#include
#include
int kmp_table(const unsigned char * W,int len,int* T)
{
if(!W||!T) return 1;
int pos=2,cnd=0;
T[0]=-1,T[1]=0;
while( pos
if( W[pos-1]==W[cnd] ){
cnd=cnd+1,T[pos]=cnd,pos=pos+1;
}
else if( cnd>0 ){ cnd=T[cnd]; }
else{ T[pos]=0;pos=pos+1; }
}
return 0;
}
int kmp_search(const unsigned char * S,const unsigned char * W,int sLen,int wLen)
{
int m=0,i=0;
int *T=(int*)malloc(wLen*sizeof(int));
kmp_table( W,wLen,T);
while( m + i
if( W[i] == S[m+i] ){
if( i==wLen-1 ) { free(T);return m; }
i++;
}
else{
if( T[i] > -1 ) { m=m+i-T[i], i=T[i]; }
else{ i=0, m++; }
}
}
free(T);
return sLen;
}
int main()
{
int n=kmp_search( (const unsigned char *)"bcaaaaa",(const unsigned char *)"aaa",5,3);
printf("%d\n",n);
return 0;
}
------解决思路----------------------
求子串的Next数组
void getNext(char *str, int *next)
{
assert(str != NULL && next != NULL);
int size = strlen(str);
if(size == 0)
return;
int i = 0;
int k = -1;
next[0] = -1;
while(i
{
if(k == -1
------解决思路----------------------
str[i] == str[k])
{
i++;
k++;
if(str[i] == str[k])
{
next[i] = next[k];
}
else
{
next[i] = k;
}
}
else
{
k = next[k];
}
}
}
------解决思路----------------------
http://blog.csdn.net/yutianzuijin/article/details/11954939
这个建议楼主仔细看看 说的还是比较清楚的
------解决思路----------------------
静下心好好分析