字符串匹配算法之KMP算法(图例详解)

1.字符串匹配算法及暴力算法

字符串匹配算法之暴力做法(朴素算法)我这篇文章已经详细介绍了字符串匹配算法以及它的暴力算法。现在简单复习一下。

1.1 简介

字符串匹配算法又称模式匹配(pattern matching)。该问题可以概括为「给定字符串ST,在主串S中寻找子串T」。字符T称为模式串 (pattern)。

1.2 示例题目

还是使用来自leetcode 28. 实现 strStr()的这道题。

实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
示例 1:

输入: haystack = "hello", needle = "ll"
输出: 2

2.KMP算法(Knuth-Morris-Pratt algorith)

2.1 朴素算法的缺点

在介绍KMP算法之前,我们先回顾一下朴素算法的缺点,有助于我们更好地理解KMP算法。
先看一下这个例子:

txt[] = “AAAAAAAAAAAAAAAAAB”
pat[] = “AAAAB”

如果是朴素算法一个一个对比的话,pat[]一个一个地右移。

第一步:
image.png
第二步:
image.png
第三步:
image.png\

而其实我们在第一步时就已经匹配过中间的3个A了。

image.png
这就是朴素算法重复的部分,而KMP算法就将重复的部分跳过了。

2.2 KMP算法

KMP算法是如何跳过这一部分的,我们首先需要了解前缀函数。

2.2.1 KMP算法中的前缀算法

2.2.1.1 前缀函数pi的定义

给定一个长度为n的字符串s,其 前缀函数 被定义为一个长度为n的数组p[]。 其中p[i] 的定义是:

  1. 如果子串s[0...i]有一对相等的真前缀与真后缀:s[0...k-1]s[i-(k-1)...i],那么p[i]就是这个相等的真前缀(或者真后缀,因为它们相等子串的长度,也就是p[i] = k
  2. 如果不止有一对相等的,那么p[i]就是其中最长的那一对的长度;
  3. 如果没有相等的,那么s[i]=0

简单来说p[i]就是子串s[0...i]最长的相等的真前缀与真后缀的长度。

用数学语言描述如下:
p [ i ] = m a

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值