KMP算法理解和认识

说说我对KMP算法的理解

KMP算法是一种用于模式匹配的算法,其主要的特点是以空间换取时间,在提前得到next数组信息后,利用该信息减少指针回溯,提高了匹配效率。

主要的原理是利用了提前计算好匹配串内next数组的信息,该数组记录了匹配串内每位字符内存在的最长的匹配前后缀。例如
图片说明
next数组的计算是将匹配串上每位字符前的字符(包括自己本身)取前缀后缀进行对比,得到最长前后缀长度的便是该位字符的next值。
例如匹配串中的第二个A,此时需要取前后缀的范围是A B C D A。
前缀有[A],[A B],[A B C],[A B C D]
后缀有[A],[D A],[C D A],[B C D A]
可得到最长的前后缀公共部分为[A],可得到该个A的next数组值为1,以此类推可得其他部分的next值(记得是取最长部分的公共前后缀)

在理解了如何得到next数组后理解KMP使用就简单起来了
匹配串在和主串进行匹配的过程中需要移动的下标则不需要反复回溯,匹配串只需要按照下面的规则移动:
移动步数=已匹配字符数-最后一位匹配字符的next值

例如主串为:ABCDABABCDABCDABDE
匹配串为:  ABCDABD

第一次移动步数=已经匹配字符数目(ABCDAB)- 最后一位匹配的字符next值 即 6-2=4

例如主串为:ABCDABABCDABCDABDE
匹配串为:      ABCDABD

第二次移动步数 = 已经匹配字符数目(AB)- 最后一位匹配的字符next值 即 2-0=2

例如主串为:ABCDABABCDABCDABDE
匹配串为:        ABCDABD

第三次移动步数 = 已经匹配字符数目(ABCDAB)- 最后一位匹配的字符next值 即 6-2=4

例如主串为:ABCDABABCDABCDABDE
匹配串为:            ABCDABD

此时匹配完成得到主串中匹配的位置

全部评论
感谢参与【创作者计划2期·技术干货场】!欢迎更多牛油来写干货,瓜分总计20000元奖励!!技术干货场活动链接:https://www.nowcoder.com/link/czz2jsghtlq(参与奖马克杯将于每周五结算,敬请期待~)
点赞 回复
分享
发布于 2021-03-08 16:09
小红书
校招火热招聘中
官网直投
不错的贴子 介绍清楚了KMP
点赞 回复
分享
发布于 2021-04-19 22:22

相关推荐

14 24 评论
分享
牛客网
牛客企业服务