KMP算法原理与next数组取值思想与原理

  1. 字符串匹配
    字符串匹配是计算机的日常任务之一,对字符串的匹配,我们应该会在脑海中想到,我们可以把字符串的匹配模式,但如果算法效率低,时间复杂度很大,该算法就是一种比较低级的算法。
    推荐文章[https://blog.csdn.net/qq_37568658/article/details/79313639]
    介绍了暴力算法的原理,这里就不再累赘说明。
    下面我要介绍的是KMP算法

  2. 算法原理
    匹配分为两种情况,
    1.匹配模式的字符与主串相同,这种情况无需多考虑,只需匹配模式指针j与主串的i指针各加1,大家都移动下一个位置,进行一一配对,直到结束之前,如果存在不匹配的话,第二种情况就出现了
    2.这种情况下,区别于暴力算法,主串i指针不会回退到本次开始的下一个位置,而是原封不动,主串不动,而是匹配模式动,这个时候,就要看哪个位置不配对,我们就在《匹配表》中,找匹配模式不匹配的位置,对应的next数组的值,然后,根据next数组的值,把该值给了匹配模式的指针j,然后按照正常匹配进行,如果发现,j已经是第一个匹配模式的字符,而与主串还不匹配,这种情况,只能主串的向后移动一个位置,重新开始匹配。
    很显然,重点在于next数组的取值问题,那么,next数组该如何取值呢?上篇文章有提到如何取值,这里就不再说明。
    但有一个重点必须强调,对理解next数组取值原理有帮助。

在这里插入图片描述在这里插入图片描述其中有一张图片,其中next数组取值与原文的部分匹配表不一致,
next取值的原则为,第一个位置永远为0,第一个位置之后,如果前面的字符没有前缀和他相等,则为1,如果有,则最长长度+1

在这里插入图片描述
这里有一个疑问,为什么会根据这个值移动呢?
因为如果某一个位置不匹配,他前面的字符串一定是匹配的,这个时候说明,我们可以从前面的字符开始着手移动我们的匹配模式,我们要在匹配模式中,找出在不匹配字符位置之前的所有字符,看看哪些字符与不匹配字符前面的字符是一样的,我们就把他的位置赋给j,表明,我们把匹配模式的指针移动到该位置
这里的j是匹配模式与主串不匹配时候,匹配模式j的指针值,其中next值告诉我们,前面有没有和自己一样的字符,如果有,我们就变成他们。所以,我要向前移动j-next[j]个位置,因为现在我在j=j-(j-next[j])位置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值