KMP算法(无回溯字符串匹配)基于python实现

本文详细介绍了KMP(Knuth-Morris-Pratt)算法,一种无回溯的字符串匹配算法。通过分析KMP算法的运算过程,强调了预处理过程中构建的pnext表的重要性,用于记录模式串的最长相等前后缀。KMP算法避免了朴素匹配算法中的无用回溯,提高了匹配效率,时间复杂度为O(m+n)。文章还提供了基于Python的pnext表构造和串匹配的实现。
摘要由CSDN通过智能技术生成

1.问题导出

给你两个字符串,一个是目标串,比如是“ababcabccacbab”,另一个是模式串,比如是“abcac”,现在想在目标串中找出是否含有模式串的子串,如果有,返回第一个字母的下标,如果无,返回-1

当运用朴素的串匹配算法去解答该题时,分为以下两步:

(1)目标串与模式串从左到右依次匹配

(2)当发现不匹配时,转去考虑考虑目标串里的下一个位置是否与模式串匹配

思路非常简单,但是当考虑复杂度时,可以发现,在在坏的情况下,比如:

目标串:“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab”

模式串:“aaaab”

在这里,时间复杂度达到了O(n*m),n为目标串长度,m为模式串长度。在朴素的匹配算法下,由于认为字符串前后是完全独立,所以每次匹配时,都是从头开始匹配,所以效率很低。但是,大部分的字符串都是相关联的。例如在上述的模式串“abcac”中,

 

按照朴素串匹配算法,当左图中的最后一个字符不匹配时,下一步,是目标串重新开始用另一个字符与模式串做匹配。但是完全可以如下图所示直接跳到更远的地方,拿开始的a与目标串中的a直接做匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值