简介
KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。主要用于解决字符串模式匹配。
一般的解法-BF算法
BF算法思想
Brute-Force算法又称做"蛮力匹配"算法,从主串S的第pos个字符开始,和模式串T的第一个字符进行比较,若相等,继续逐个比较后续字符,否则回溯到主串S的pos+1个字符重新和模式串T进行比较。以此轮推,直到匹配成功,或者退出循环匹配失败。
图解
如初始化pos=0,S串和T串如下

比较i指针指向的字符和j指针指向的字符是否一致。如果一致就都向后移动,如果不一致,如下图:

A和E不相等,那就把i指针移回第1位(假设下标从0开始),j移动到模式串的第0位,然后又重新开始这个步骤:

直到匹配成功或退出循环。
程序代码
public static int bf(String S,int pos ,String T) {
int i = pos; // 主串的位置
int j = 0; // 模式串的位置
while (i < S.length() && j < T.length()) {
if (S.charAt(i) == T.charAt(j)) {
// 当两个字符相同,就比较下一个
i++;
j++;
} else {
i = i - j + 1; // 一旦不匹配,i后退
j = 0; // j归0
}
}
if (j == T.length()) {
return i - j;
}
else {
return -1;
}
}
KMP算法
算法引入
上面的算法思想比较简单,但当在最坏情况时,算法的时间复杂度为O(n*M),其中n,m分别为主串和模拟串的长度,其中主要的时间耗费在失配后的比较位置有回溯,而KMP算法正是对这一问题改进算法,改进后的时间复杂度为O(n+m)。
难点突破
移动问题思路分析
整个KMP的重点就在于当某一个字符与主串不匹配时,我们应该知道j指针要移动到哪?
首先我们来看一下自己发现的j的移动规律:

如图:C和D不匹配了,我们要把j移动到哪?显然是第1位(所有下标都从0开始,如果觉得绕可理解为i,j不动,移动T数组)。因为前面有一个A相同:

如下图也是一样的情况:

KMP算法是一种用于字符串模式匹配的高效算法,由Knuth、Morris和Pratt提出。它通过构造next数组避免了BF算法在失配后的无效回溯,从而将时间复杂度降低到O(n+m)。本文详细介绍了KMP算法的思想,next数组的求解过程,以及算法优化的要点。

2028

被折叠的 条评论
为什么被折叠?



