KMP-字符串快速匹配算法

本文介绍了KMP算法,一种用于字符串匹配的高效算法,其时间复杂度为O(n+m)。文章首先回顾了朴素字符串匹配的局限,然后详细解释了KMP算法的核心思想——nextVal[]数组的求解过程,包括next[]数组的递推关系,并提供了Java版的代码实现。最后,阐述了如何使用KMP算法进行主串的匹配操作。
摘要由CSDN通过智能技术生成

之前一直保持在word文档中记录总结,最近发现C博客是个分享的好地方,记录自己学习总结的同时,也可以把总结拿出来分享,万一能帮到别人呢^_^
花了两天,把KMP算法搞懂了,此篇旨在用通俗易懂的语言讲算法实现过程,但看此篇之前最好对朴素字符串匹配动手写过代码。好了,下面进入正题。
朴素字符串匹配算法时间复杂度为O(n*m),n/m分别为主串/子串长度,而KMP算法的时间复杂度为O(n+m)。当主串或子串非常长时,这个时间提升的就非常明显了。
KMP算法思路:主串指针i不回溯,只回溯子串指针j,指针j回溯到哪,就看nextVal[i]的值了。所以该算法关键是求nextVal[]数组。其实nextVal[]是在next[]数组的基础上求得的,它改进了使用next[]的不足。下面一步步来讲。
1、next[]数组求解
这里需要先将所给子串化成字符数组char[] p,从1开始放子串字符(为什么从1开始,为了数组计算方便),所以p.length=子串长度+1,next[]长度等于p的长度。
抽象层面来说,next[i]=子串p[1,2,…,i-1]中前缀子串与后缀子串相等时的最大长度+1。具体利用代码自动求解,可以利用next[i]与next[i+1]的递推关系,如下图所示。
这里写图片描述
假设已知next[i]=j,即p[1,…,k-1]=p[i-k+1,…,i-1],这时比较p[i]和p[j]:
(1)如果p[i]=p[j]=p[next[i]],则有p[1,…,j]=p[i-j+1,…,i],前缀子串与后缀子串相等的最大长度为j+1,即next[i+1]=j+1=next[i]+1.
(2)如果p[i] != p[j],则将j回溯到next[i],即j=next[i],然后继续比较p[i]和p[j].
(3)这里注意特殊情况:j回溯到0后,即到了上图最下面j==0的情况,因为p[0]里面为非子串字符ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值