KMP算法基本知识

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

所以公共的前后缀:AABA

2.4、最长公共前后缀

如同 2.3 所示,在公共的前后缀:AABA

最长的公共前后缀的子串是 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数组。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值