KMP板子(其实还没完全懂...)

KMP模板

1.next数组的实际含义

next数组从-1开始,主串a,子串b,next[j]=k,满足b[0,k-1]==b[j-k,j-1],k同时也为b子串前缀的下标,j为b子串后缀的下标

get_next函数如下:

void get_next(string b,int *next) 
{
	int k=-1,j=0;
	next[0]=-1;
	while(j<b.size()) 
	{
		if(k==-1 || b[k]==b[j])
			next[++j]=++k;   //next[j]=next[j-1]+1; 
		else k=next[k];   //k回溯
	}
}

2.KMP板子

int KMP(string a,string b,int *next)
{
	int i=0,j=0;
	while(i<a.size())
	{
		if(a[i]==b[j] || j==-1) i++,j++; //相等后移
		else j=next[j];
		if(j==b.size()) return i-j;
		else if(j>b.size()) return -1; 
	}
}

3.总结(后续补充)

KMP关键在于next数组的理解和求法,其中k的值和next[k]的值都包含着多种意思合并,有些难理解(总之我还是没太明白/fad)

KMP中next数组本质上是一种动态规划的思想,求出next的递推公式,next[]代表着集合:在长度为j-1的子串中有b[0,k-1]==b[j-k,j-1](k为最大值)。也就是所说的前缀和和后缀和的最长公共长度k.

KMP通过next数组将复杂度降为O(n),是一种很大的优化,以后有机会要继续理解

posted @ 2021-04-08 20:38  gonghw403  阅读(5)  评论(0编辑  收藏