KMP

152 阅读1分钟

KMP算法定义

KMP算法是一种字符串匹配的算法,KMP算法的核心是利用匹配失败的信息,尽可能的减少模式串与主串的匹配次数。其重要的一个就是next[]数组的实现。时间复杂度为O(m+n)

next数组

Next数组包含模式串的匹配信息,主要保存当前位置的后缀与字符串前缀匹配的最大位置。Next[ i ]=j:表示i位置的后缀与字符串前缀匹配的最大位置为j,如果i+1位置匹配不成功,可以从next[ j ]+1位置开始匹配。

计算next数组

void solveNext(string pattern,int next[])//计算next数组 
{
        next[0]=-1;
	for(int i=1,j=-1;i<pattern.size();i++)
	{
		while(j!=-1&&pattern[i]!=pattern[j+1]) j=next[j];//如果i与j+1位置不同,则将j设置为j的最大前缀位置。 
		if(pattern[i]==pattern[j+1]) j++;//i位置与j位置相同 
		next[i]=j;//j为i位置的最大前缀位置。 
	}	
}

使用next数组

int maxCount(string query,string pattern)//求出最大匹配次数。 
{
	int next[N];
	solveNext(pattern,next);
	int count=0;
	for(int i=0,j=-1;i<query.size();i++)
	{
		while(j!=-1&&query[i]!=pattern[j+1]) j=next[j];//如果i与j+1位置不同,则将j设置为j的最大前缀位置。
		if(query[i]==pattern[j+1]) j++;//i位置与j位置相同
		if(j==pattern.size()-1)//当前位置为模式串的最大长度表示匹配成功 
		{
			count++;
			j=next[j];//匹配成功之后要设置当前位置的最大前缀位置 
		}
	}
        return count;
}