怎样理解KMP算法中模式串后移的目标位置?

怎样理解KMP算法中模式串后移的目标位置?

到这里大家对KMP应该有所了解,这里就不对KMP的相关概念进行介绍了。
KMP有个很基本的思想,就是当主串和模式串出现不匹配,需要进行下次匹配前,我们移动的是模式串,而非主串。例如:
串“abdabc” 和串"abc"
在这里插入图片描述

注:计算机中模式串是不会移动的,所以这里所说的“移动”也就是其下标 j 指向的变化
插播一张图片:
在这里插入图片描述
图片中Pj(图有点不清晰,五个灰单元格后的那个单元格)即为模式串与主串发生不匹配的位置。
前面已经提到,KMP算法中需要移动的是模式串,主串只有一个作用:判断与模式串中的字符是否相等,所以当发生不匹配,需要判断下一个匹配位置时,可以先将主串“大哥”晾在一边,只分析模式串。

书中的定义:当位置(下标)j处发生不匹配时,j重新指向的位置恰好是F串中前后相重合子串的长度加1(串Fl或Fr的长度+1)
:F,上述图片中P1~Pj-1 长度的串,即Pj之前的串
FI,I即 left,代表F左边的一部分串
Fr,r即right,代表F右边的一部分串
这两部分串相等(字符相等且长度相等,例如abcdab中Fl=Fr=“ab”)

其实这个定义很好理解,例如串“abacde”与串“abad”进行匹配

在这里插入图片描述

你想想,如果你是模式串,来到了主串中的第4个位置(此时发现与其字符不匹配),我们可能会想着让j指向0,重新进行匹配,可是当不匹配位置(i=4)的前面明明有和模式串中前面一或多个字符相等的情况下,也就是这些相等的字符已经匹配过,那么我们就应该从没匹配的位置开始,也就是重合字符串的长度+1
其实我表达能力极差…不知道对有疑惑的小伙伴们能不能提供点帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值