KMP算法指的是字符串模式匹配算法,具体问题为在主串S中找到第一次出现完整子串P时的起始位置。
目的:如果每次查到不匹配就从下一个开始查时间复杂度过高,利用子串相同的前后缀来优化查询匹配过程。
手动计算的话next数组就是最大前缀后缀公共元素长度向右平移一格再减1。
代码求解next数组最关键的一句话为当 S [ k ] != S [ j ] 时令 k = next [ k ]
这句话的意思为若当前字符不匹配,则找它前面的最大前缀后缀公共元素长度,如果都没有自然就是0了。
(其实求next数组的过程类似于做了一遍kmp)
KMP算法:
int KmpSearch(char* s, char* p)
{
int i = 0;
int j = 0;
int sLen = strlen(s);
int pLen = strlen(p);
while (i < sLen && j < pLen)
{
//如果j=-1,或者当前字符匹配成功(即S[i]==P[j]),都令i++,j++
if (j == -1 || s[i] == p[j])
{
i++;
j++;
}
else
{
//如果j!=-1,且当前字符匹配失败(即S[i]!=P[j])
//则令i不变,j=next[j]
//next[j]即为j所对应的next值
j = next[j];
}
}
if (j == pLen)
return i - j;
else
return -1;
}
具体算法过程参考sofu6的博客https://www.cnblogs.com/dusf/p/kmp.html,回忆总结用。