1.作用
用于字符串匹配,是一种改进的方法
2.原理
KMP算法的关键是根据给定的模式串Pattern,定义一个next数组。next数组包含了模式串本身局部匹配的信息,即保存中间子字符串从字符串开头匹配的最长公共前缀信息。
3.操作过程
假设在模式匹配的进程中,执行S[i]和P[j]的匹配检查。若S[i]=P[j],则继续检查S[i+1]和P[j+1]是否匹配。若S[i]<>P[j],则分成两种情况:若j=1,则模式串右移一位,检查S[i+1]和P[1]是否匹配;若1<j<=m,则模式串右移j-next(j)位,即执行j=next[j]操作,检查S[i]和P[next(j)]是否匹配。重复此过程直到j=m或i=n结束。
4.时间复杂度
O(m+n)
5.代码实现
//Preprocessing algorithm(计算前缀的函数)
void kmpPreprocess()
{
int i=0, j=-1;//-1表示没有找到
b[i]=j;
while (i<m)//小于m是因为循环内先++,后赋值
{
while (j>=0 && p[i]!=p[j]) j=b[j];//j能取0是因为要从第0个字符比较
i++; j++;
b[i]=j;
}
}
//Searching algorithm(字符串匹配模式搜索函数)
void kmpSearch()
{
int i=0, j=0;
while (i<n)
{
while (j>=0 && t[i]!=p[j]) j=b[j];//当j为-1时表示找不到
i++; j++;
if (j==m)
{
report(i-j);
j=b[j];
}
}
}
6.参考文献
http://chaoswork.com/blog/2011/06/14/kmp%E7%AE%97%E6%B3%95%E5%B0%8F%E7%BB%93/