KMP算法

void SetNext(const char *T, int kmpNext[])

{
int len=strlen(T);//模式字符串长度。
kmpNext[0]=0;
for(int i=1; i<len; i++)
{
int k=kmpNext[i-1];

while( T[i] != T[k] && k!=0 ) //查找是否有匹配项 
k=kmpNext[k-1]; 
if( T[i] == T[k])//如果有,则next数组位置加1
kmpNext[i]=k+1;
else
kmpNext[i]=0;//如果不匹配
}
}
int kmp2(int start,char *S,char *T)
{
int kmpNext[256];
SetNext(T,kmpNext);

int slen=strlen(S);
int tlen=strlen(T);

int i,j;
j = 0;
for (i=start;i<slen;i++)
{
while (j>0 && T[j]!=S[i])//比较字符是否相等
j = kmpNext[j-1];

if(T[j]==S[i] && ++j == tlen)//字符相等,next进位,且如果已经匹配字符,则找到
{
int ans = i-tlen+1;
printf("%d\n",ans);
return ans; 
}
}
return -1;
}

  

原文地址:https://www.cnblogs.com/273809717/p/2803825.html