【搞定算法】KMP 算法

本文详细介绍了KMP算法,包括问题描述、next数组的概念、代码实现及KMP的应用,如子树问题和加最短字符问题。KMP算法通过预处理next数组,将字符串匹配的复杂度降低至O(N + M)。
摘要由CSDN通过智能技术生成

目  录:

1、问题描述

2、next 数组

3、代码实现

4、KMP 的应用

4.1、子树问题

4.2、加最短字符问题


前面讲过字符串匹配的其他几种算法:字符串匹配算法之 BF、RK、BM。

本文用来讲解 KMP 算法及其应用,KMP 算法时间复杂度为:O(N + M),空间复杂度为:O(M)。

1、问题描述

给定两个字符串 O 和 f,长度分别为 n 和 m,判断 f 是否在 O 中出现,如果出现则返回出现的位置。常规暴力方法是遍历 o 的每一个位置,然后从该位置开始和 f 进行匹配,但是这种方法的复杂度是 O(N x M)。KMP 算法通过一个 O(M) 的预处理(next 数组)可以加速匹配速度,使匹配的复杂度降为 O(N + M)。 

2、next 数组

注意:next 数组是针对标准串而言的(上图中 f 是标准串、O 是母串)。

其实字符串匹配算法理解起来并不难,非常直观,结果就要求要匹配的字符在两个串中一一对应。但是为了提高暴力解法的效率,就必须提高字符串的匹配速度,其实就是解决每次匹配失败如何往前多移几位的问题,不要每次都是匹配失败,移动一位再重头开始。next 数组就是来做这件事情的,每次匹配失败,查找匹配串匹配失败位置处对应的 next 值,标准串向前移动 next 值那么多的长度,然后再继续和母串匹配。

那下面就讲一下 next 数组究竟是什么:

如上图所示:next 数组存放的是字符串 f 的 i 位置前面字符串的最长前缀和最长后缀的匹配长度【前缀不能扩到最后一个字符,后缀也不能扩到第一个字符】。

  • A 段字符串是 f 在 i 位置的最长前缀子串;
  • B 段字符串是 f 在 i 位置的最长后缀子串;
  • A 段字符串和 B 段字符串相等。

分析:在字符串 O 中寻找 f,当匹配到位置 i 时两个字符串不相等,这时我们需要将字符串 f 向后移动。常规方法是每次向后移动 1 位,但是它没有考虑前 i - 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值