69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <malloc.h>
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<len ){
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 < sLen ){
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;
}