字符串的模式匹配算法(思想+python实现)

本文介绍了字符串的模式匹配算法,重点讲解了KMP算法的思想和改进过程,包括next数组的推导和如何避免冗余步骤。给出了KMP算法的时间复杂度,并提供了一个Python求解next数组的程序示例。
摘要由CSDN通过智能技术生成

朴素的模式匹配算法

一个例子:

从主串 S = "goodjob"中,找到子串 T = "job"的位置。我们通常需要下面的步骤。

1. 将子串"job"与主串S从第一位对应匹配。即判断 whether 'g' == 'j';
2. 判断结果为否,继续匹配 whether 'o' == 'j';
3. 直到找到第一位匹配 'j' = 'j';
4. 继续匹配完整 S[4:7] == 'job' == T。

是一种最简单的匹配算法,暴力易实现,但有许多冗余的步骤。

KMP 模式匹配算法

总的思想是:通过字符串已有的信息来规避朴素模式匹配中可以省略的步骤。

详细的过程不再赘述,在这里只进行简要的说明。

已知主串的下标为 i i i, 子串的下标为 j j j, 总结下来是两短句:“ i i i 不回溯, j j j n e x t next next”。

i i i 不回溯:指的是在匹配过程中,主串的匹配下标永远只会增加或不变,不会再去匹配之前主串的下标。

j j j n e x t next next:指的是子串的下标匹配规则是依照 n e x t next next 数组值。

那么下面要详细说明 n e x t next next 数组值是什么。

n e x t next next 数组值推导

先给出数学式的定义:
n e x t [ j ] = { 0 , 当 j = 1时 M a x { k ∣ 1 < k < j , 且 ′ p 1 . . . p k −

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值