KMP算法
相对于BF算法,KMP算法更为高效。原因在于BF算法的时间复杂度为O(mn),m代表主串的长度,n代表子串的长度。而KMP算法的时间复杂度为O(m+n)。
KMP算法的精髓就在于当某一次匹配失败之后,指向主串的迭代器不会回退,指向子串的迭代器会回退到某一特定的位置。
int KMP(const char *str,const char *sub,int pos,int *next)
{
assert(str!=NULL&&sub!=NULL);
int i = pos;
int j = 0;
int lens=strlen(str);
int lensub = strlen(sub);
while(i<lens&&j<lensub)
{
if(str[i]==sub[j])
{
++i;
++j;
}
else
{
++i;
j=next[j];
if(j==-1)
{
++j;
}
}
}
}
next数组
如果我们能够通过next[i]的值,通过一系列的转换得到next[i+1]的值,那么,最终就能得到next数组。首先假设next[i]=k成立,那么就有这个式子成立,P0…Pk-1=Px…Pi-1,然后我们假设Pk=Pi;可以得到P0…Pk=Px…Pi,即next[i+1]=k+1,当Pk!=Pi时?
void getNext(int *next,const char *sub)
{
assert(next!=NULL&&sub!=NULL);
next[0]=-1;
next[1]=0;
int j = 2;
int k = 0;
int len = strlen(sub);
while(j<len)
{
if(k==-1||sub[k]==sub[j-1])
{
++j;
++k;
next[j]=k;
}
else
{
k=next[k];
}
}
}