KMP
0.1
目录
基本介绍
kmp利用next数组记录在比较字符串时遇见的最长前缀及最长后缀相同的长度,从而实现不回溯且大幅移动字符串,时间复杂度为O(n+m).可以看出,kmp的核心就是next数组的构建.
其实对于这种概念性的东西,要充分利用优势:手推和刷题来辅助理解.另对于上面所提的bm和sunday算法,试毒后发现实际操作不算理想,不推荐.
失配时,模式串向右移动的位数为:失配字符所在位置 - 失配字符对应的next 值.
代码实现
//s-l1
//c-l2
void getne()
{
int i=0,j=-1;
ne[0]=-1;
while(i<l2-1)
{
if(j==-1||c[i]==c[j])
{
i++,j++;
if(c[i]!=c[j]) ne[i]=j,continue;
ne[i]=ne[j];
continue;
}
j=ne[j];
}
}
int kmp()
{
int i=0,j=0;
while(i<l1&&j<l2)
{
if(j==-1||s[i]==c[j])
i++,j++,continue;
j=ne[j];
}
if(j==l2) return i-j;
return -1;
}