Bootstrap

C语言KMP算法(便于理解版本)

一.前言

笔者经过学习并对KMP算法思考理解,想在本文与各位大佬萌新进行讨论,也算是笔者对这一算法学习的总结,供大家参考,并可以对更简单的理解给予我私信,共同进步。

本文从三个方面对KMP算法进行讨论

1.从BF算法引入KMP

2.next数组的含义

3.求解next数组

二.正文

2.1从BF算法引入KMP

BF算法就是我们说的暴力匹配,我们知道主串中包含了很多个与我们要找的模式串长度相同的子串,所以暴力匹配算法相当于把这些子串都和模式串compare了一次,但是我们在真实的比较过程中不是把所有子串找出来,而是移动指针比较,如图:

我们现在就可以移动P1和P2指针进行比较,当P1和P2相等时,继续向后比较,如果不等那么我们需要把模式串向后移动一位,继续前面的操作如图:

当指针指向P1和P2所示,表示不满足,此时我们认为这个A开头的子串不可能匹配了,就把模式串移动到B开头的子串进行比较,为了方便我后面图把主串令为S1,模式串为S2:

所以只需将模式串按照上面步骤依次比较,直到找到我们想要匹配的子串为止,当满足以下两个条件时结束:

1.当P2等于斜杠0了,证明找到了(有些教材用的是字符串的长度判定)

2.当 P1等于斜杠0,证明找不到

但是细心的朋友比较上面两个图发现,当我重新从B进行比较的时候,P1回到了B的位置,P2回到了A的位置,我们把这个称作指针回溯,每一次都要重新把主串回溯到上一次比较的下一个位置&#

;