KMP 算法通过构建失败函数进行预处理,在匹配过程中根据失败函数跳过不匹配的字符。BM 算法构建后缀表和坏字符表用于预处理,在匹配过程中根据坏字符表和好后缀表跳过不匹配的部分。

KMP 算法与 BM 算法匹配过程
KMP 算法(Knuth-Morris-Pratt)
- 预处理(构建失败函数):计算每个模式字符在模式串中与当前字符不匹配时,匹配的最长后缀前缀长度。
-
匹配过程:
- 将模式串的第一个字符与文本串的当前字符比较。
- 如果匹配,则向前移动模式串和文本串中的字符。
- 如果不匹配,则根据失败函数跳过模式串中一部分不匹配的字符,然后继续比较。
BM 算法(Boyer-Moore)
-
预处理(构建好后缀表和坏字符表):
- 好后缀表:记录模式串尾端匹配的后缀数量。
- 坏字符表:记录模式串中最后一个出现过的字符及其与当前字符不匹配时的位移距离。
-
匹配过程:
- 从文本串结尾开始,比较模式串的最后一个字符与文本串的当前字符。
- 如果匹配,则向前移动模式串和文本串中的字符。
- 如果不匹配,则根据坏字符表跳过模式串中最后一个字符与当前字符不匹配的位移距离。
- 如果坏字符表中没有该字符,则根据好后缀表跳过与模式串结尾匹配的最大长度。










