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;
}