模式串有特征,可以利用这种特征 把前面的匹配结果直接拿来用。
int kmpSearch(char *s,char *p,int next[])
{int i=0;
int j=0;
int sLen=strlen(s);
int pLen=strlen(p);
while(i<sLen&&j<pLen)
{
if(j==-1||s[i]==p[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(j==pLen)
return i-j;
else
return -1;
}
void getNext(char *p,int next[])
{
int pLen=strlen(p);
next[0]=-1;
int k=-1;
int j=0;
while(j<pLen-1)
{
if(k==-1||p[j]==p[k])
{
k++;
j++;
next[j]=k;
}
else
k=next[k];
}
}