Pattern Match KMP 算法/子串匹配算法简述

本文介绍了KMP算法,一种用于解决子串匹配问题的线性时间复杂度算法。通过生成lps数组来避免重复比较,提高匹配效率。文章详细阐述了KMP算法的步骤,包括如何生成lps数组,并提供了优化思路,例如使用next数组代替lps数组,并展示了算法的运行过程和代码实现。
摘要由CSDN通过智能技术生成

子串匹配算法

给定一个文本text,需要筛选出与pat匹配的子串.

朴素算法

对于长度为n的文本text,从每一个下标开始进行匹配,有(n-m)中选择,最坏情况下,每次都匹配成功,则复杂度为: O ( ( n − m ) m ) = O ( n m ) O((n-m)m) = O(nm) O((nm)m)=O(nm), 其中m为字符串pat的长度.

从字符串的匹配过程来看,当发生匹配失败或者匹配成功时,pattern的滑动成为了问题的关键.
image-20201106174625310

朴素算法每次滑动一个单位,导致了大量的重复比较.

想办法多滑动几个单位是模式匹配优化的关键.

我们追求一种线性复杂度的算法,当然这种算法是存在的,这就是KMP算法.

KMP算法

我们暂时不证明KMP算法的有效性,这里仅给出KMP算法的一般步骤.

KMP算法的关键在于生成lps数组. lps数组的元素lps(i)代表着text[0:i+1]的前缀和后缀相同的长度,且前缀长度小于i+1.

例:

从前往后匹配当发生不匹配或者匹配成功时,把j赋值为lps[j-1],如果j为0,则 i向后移动一位.

image-20201106165555732
代码实现

在实现代码时,存在一些优化方法.

  • 用next数组替换lps数组
  • 求解lps的优化

对于第一点,比较明确,就是把lps数据整体右移一个单位,即有
n e x t [ i ] = { l p s [ i − 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值