1、KMP算法
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。
KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。
KMP算法的时间复杂度O(m+n)
简而言之,KMP算法是查找 字符串A在字符串B 出现的位置
(KMP 方法算法就利用之前判断过的信息,通过一个 next 数组,保存模式串中前后最长公共子序列的长度,每次回溯时,通过 next 数组找到,前面匹配过的位置,省去了大量的计算时间。)
2、字符串的最长公共前后缀
2.1、前缀
字符串的前缀是指不包含最后一个字符的所有以第一个字符(索引为0)开头的连续子串
比如字符串 “ABABA” 的前缀有:A、AB、ABA、ABAB
2.2、后缀
字符串的后缀是指不包含第一个字符(索引为0)的所有以最后一个字符为结尾的连续子串
比如字符串 “ABABA” 的后缀有:BABA、ABA、BA、A
2.3、公共前后缀
比如字符串 “ABABA” ,
- 前缀:A、AB、ABA、ABAB
- 后缀:BABA、ABA、BA、A
所以公共的前后缀:A、ABA
2.4、最长公共前后缀
如同 2.3 所示,在公共的前后缀:A、ABA
最长的公共前后缀的子串是 ABA
(前缀与后缀的连续子串中存在相同且最长的子串 ABA,因此该子串的最长公共前后缀 为 3)
3、前缀表
比如一个字符串:ABABA,
公共前后缀整理有:A-0;AB-0;ABA-1;ABAB-2;ABABA-3;
因此有前缀表: 0 0 1 2 3
当遇到冲突的位置(不匹配的位置时),就会在这个的前面的子串中寻找最长的相同的前后缀(最长公共前后缀),所以是子串 ABABA 。
“3”表示,3位后缀也有相同的3位前缀,于是定位到与其后缀相等的前缀的下一位进行继续匹配。所以是在下标是3(第一位索引是0)的位置再去匹配,寻找相同的字符串的位置。
4、next数组
next数组其实与前缀表是同样的用法,其实就是将前缀表的数据储存在一个名为next的数组里面;但是也有情况是将前缀表减一的数据储存在数组里面,这种也是next数组。