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)code

KMP中next數組本質上是一種動態規劃的思想,求出next的遞推公式,next[]表明着集合:在長度爲j-1的子串中有b[0,k-1]==b[j-k,j-1](k爲最大值)。也就是所說的前綴和和後綴和的最長公共長度k.get

KMP經過next數組將複雜度降爲O(n),是一種很大的優化,之後有機會要繼續理解string

相關文章
相關標籤/搜索