定义
KMP算法是一种改进的字符串匹配算法,KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。
中心思想
利用已经匹配过的信息,避免再次进行重复匹配
代码实现
int lenA = strlen(A + 1), lenB = strlen(B + 1);
nxt[1] = 0;//对于第一个位置,它只能从头开始匹配
//更新所有B中前缀子串的最大前后缀相等长度nxt数组
for (int i = 2, j = 0; i <= lenB; i++) { //j指代B[i]的下一个查询的位置
while (j > 0 && B[i] != B[j + 1]) j = nxt[j];//不相等就往回移动
if (B[i] == B[j + 1]) j++; //移动完后,相等就再向后移动一个
nxt[i] = j; //对于B[i]而言,查询完它之后就可以直接跳到B[j]
}
//使用B对于A中前缀子串的最大前后缀相等长度进行对于不可能情况的快速跳跃
for (int i = 1, j = 0; i <= lenA; i++) {
while (j > 0 && (j == lenB || A[i] != B[j + 1])) j = nxt[j];//这里要注意全部匹配成功也要结束while
if (A[i] == B[j + 1]) j++;
f[i] = j;
}
时间复杂度
假设主串长度为m,子串长度为n,那么主串要比对m-n+1个字符(除了最后那个长度比子串还短的都要比对) 最晦气的情况是刚好每次都是子串的最后一位不同步,那么每个主串字符都要比对n次 最坏情况的时间复杂度将是 O(m-n+1)即 O(mn-+n)实际情况是m远大于n(毕竟这个算法发明的意义就是解决m远大于n时暴力算法的不适用),所以可以简写为O(mn)