菜鸟都能理解的看毛片(KMP)算法

本文用通俗易懂的方式介绍了KMP算法,这是一种O(n)时间复杂度的字符串匹配算法。通过两个指针i和j来指示待匹配字符串A和模式字符串B的位置,避免了重复比较,从而提高了效率。文章还详细解析了KMP算法的过程,并给出了指示数组P的构造方法和算法的源代码。
摘要由CSDN通过智能技术生成

首先,允许我标题党了,看毛片算法和毛片没啥关系,如果你不小心进来了,那么我只能说呵呵了,呵呵^ ^

KMP算法其实是一个O(n)的字符串匹配算法

A = "ababacbacab"

B = "baca"

假设位置从1开始

这样可以说B是A的一个子串,首先我们想到的办法是枚举A的位置,比如

1.首先枚举位置A[1],即字符'a',然后从A[1]开始比较"abab"是否等于"baca",显然不等

2.接着枚举位置A[2],即字符'b',然后从A[2]开始比较"baba"是否等于"baca",显然,又不匹配

......

经过不断得尝试,我们终于枚举到一个位置A[7]开始的子串"baca"与B相等,my god,真不容易

我们来计算一下时间复杂度,我们枚举A的位置,最多有O(A.length())个位置,并且每个位置最多要匹配O(B.length()),所以,算法复杂度当然是O(A.length()*B.length())的啦


下面我们来见识一下神奇的看毛片算法

看毛片算法的思想是用两个指针i和j来指示A和B中的一个位置

1) 用i来表示当前匹配到A中的哪个位置啦

2) 用j来表示当前匹配到B中的哪个位置啦

3) 并且要满足B[1...j]要和A[i+j-1...i]相等

哦?很难理解啊,下面的图(图1)应该使你能够一拍脑袋,“哦,我太聪明了,这么简单!”

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值