这是一个判断字符串A是否包含在B中的问题,
比如(A) "abgab" 与(B) "abcabf abgab "
kmp的思路是先分析要匹配的字符串A的内在结构特点 ,做出一张表格记录他的内部特征,然后匹配的时候就可以根据这个字符串的特征查询已经匹配的信息,对B跳跃式的比较,具体比较方法后面在说,先看看他怎么分析特征的.
abgab的特征计算方法:
1,为每一个子串计算前缀与后缀相匹配的最大字符长度
前缀就是从第一个字符开始的一系列子串,但不包含A字符串的最后一个字符
后缀类似,但是不包含A字符串的第一个字符
那么可以得到一张静态的字符串的特征表
那么到这里A字符串的特征就分析完了
怎末用呢?
一个公式如下:
下一次要跳跃到的地址=上一次匹配的开始地址+(已经匹配的长度-A字符串在B字符串中最后一个匹配的字串的特征值)
比如:上面我举得栗子:
abcabf abgab (B)
abgab (A)
这里写出步骤:
1:位置0,从第一字符开始: c与g比较失败,因为已经匹配的ab特征值为0,长度为2,要跳到的地址=0+(2-0) , 此时A从0开始到B字符串上的c开始比较
2:位置为2,c与g不匹配,那么向后继续走到下一个字符 --a,
3: 位置3,f与g比较失败,因为已经匹配的ab特征值为0,长度为2,下一个地址=3+(2-0),A字符串下一个比较的地址为5
4:位置5,f与a不匹配,向后继续走
5:位置6,空格与a不匹配,向后继续走
6:位置7,逐一字符比较成功
kmp算法的进阶计算:nextval数组
1.先计算出A字符串的特征数值,一般称为next值
2,根据当前指的字符的特征数值进行跳转,如果跳转到的next值所指的字符与当前一致,就将当前所指的字符的nextval数值置0,否则nextval就等于当前字符的next数值
来源:https://blog.csdn.net/lidashent/article/details/101143902