KMP算法简介
用于字符串匹配,其作用是在一个主字符串中查找一个模式字符串的出现位置
主串:也叫文本串,就是原始的整个字符串
模式串:需要匹配的子串
前缀:以第一个开头,不含最后一个字符的连续子串
后缀:以最后一个结尾,不含第一个字符的连续子串
最长相同前后缀:字符串的所有前缀和后缀中,最长的相同的字符串
KMP算法的基本步骤:
- 建立前缀表:通过分析模式字符串的前缀和后缀,建立一个表,指示在匹配失败时,应该跳到模式字符串的哪个位置进行下一次比较。
- 匹配过程:遍历主字符串,使用前缀表来决定如何跳转,从而减少比较次数。
为什么需要最长相同前后缀的长度呢?
前缀表的基本原理是利用模式字符串的自身信息来避免不必要的字符比较。
举个例子:有模式串abac
,当我们遍历到各个位置时,前后缀的枚举如下
a: 没有前后缀,所以最长相同前后缀的长度是0
ab: 前缀a
后缀b
,长度是0
aba: 前缀a、ab
,后缀ba、a
,长度是1
abac: 前缀a、ab、aba
,后缀bac、ac、c
,长度0
所以该模式串对应的前缀表数组为:[0, 0, 1, 0]
在匹配到第四个字符(下标3)失败的情况下,
其实可以得知前面的匹配是成功的,主串是这样的...aba*...
根据前缀表获得aba
对应的值为1,把模式串的下标移动到1,从b
开始和*
比较即可,不需要从模式串第一个字符开始比较。