KMP算法——28. 找出字符串中第一个匹配项的下标

news/2024/11/23 0:24:19/

KMP算法

今天在做字符串匹配的问题的时候想起了KMP算法。真的很难理解,所以在这里进行一个整理。
KMP算法在字符串不匹配的时候提供了一种简单的方式,使得模式串不需要从头去遍历
例如:
待匹配串saabaaf 使用i去遍历
模式串taabaab 使用j去遍历
我们使用for循环遍历ij5的时候,发现s[i] != s[j],此时j需要回退到j = 2的位置。因为st有相同的字符串aa

那么如何使得j回退到正确的位置,这里我们需要使用最长相等前后缀,用next来表示。

  • 前缀:带首字母不带尾字母的连续子串
  • 后缀:带尾字母不带首字母的连续子串

以以下字符串为例进行介绍:
a:没有最长相等前后缀, 0
aa: 前缀a等于后缀a,最长相等前后缀1
aab:后缀末尾b无匹配,0
aaba:前缀a等于后缀a,最长相等前后缀1
aabaa:前缀aa等于后缀aa,最长相等前后缀2
aabaab:前缀aab等于后缀aab,最长相等前后缀3
综上,当模式串是aabaab时,前缀表next = [0,1,0,1,2,3]。当我们发现aabaaf中指针指向f的时候不符合要求(不等于b),那我们就需要寻找前一位的next[4] = 2,查看相同的前缀(也就是aa)的后一位,指向2位置进行进一步的对比。

代码实现如下。其中,j表示为最长相等前后缀的后一个位置(方便进行比较),也是其长度

  1. 对于needle[i] == needle[j]j的左侧位置中具有与j右侧某处到i相同的字符串(j0时就是没有),此时j找后一个位置 j += 1。然后next[i] = j
  2. needle[i] != needle[j],因为是连续字符串,就需要往前找。j找它前一个位置的最长相等前后缀的后一位置(表示为next[j - 1]),看看那个位置的元素是否与needle[i] 相等。不相等继续往前找,直到j = 0。这个思路与上面aabaafaabaab不匹配时候的查找方式相似。
def getNext(needle):next = [0] * len(needle)j = 0for i in range(1, len(needle)):while j > 0 and needle[i] != needle[j]:j = next[j - 1]if needle[i] == needle[j]:j += 1next[i] = jreturn next

完整代码如下:

class Solution:def strStr(self, haystack: str, needle: str) -> int:def getNext(needle):next = [0] * len(needle)j = 0for i in range(1, len(needle)):while j > 0 and needle[i] != needle[j]:j = next[j - 1]if needle[i] == needle[j]:j += 1next[i] = jreturn nextnext = getNext(needle)j = 0for i in range(len(haystack)):while j > 0 and haystack[i] != needle[j]:j = next[j - 1]if haystack[i] == needle[j]:j += 1if j == len(needle):return i - len(needle) + 1return -1

http://www.ppmy.cn/news/328236.html

相关文章

openGauss5 企业版之yum方式安装

文章目录 1. 支持的架构和操作系统版本2. 使用限制3. 安装方式4. 使用说明 本章节主要介绍在openEuler 22.03 LTS操作系统上,通过yum命令一键安装openGauss数据库。 1. 支持的架构和操作系统版本 x86-64 openEuler 22.03 LTSARM64 openEuler 22.03 LTS 仅在openEu…

ArcGIS 制作3D遥感影像图

把遥感影像图加载到Arc Scene中,可以是landsat数据,也可以是哨兵数据,分辨率越高越好。 1:右键属性,找到图层属性里的基本高度。 2、3:从表面获取的高程,并且选择浮动在自定义表面上&#xff0…

在线绘制3D图形网站

还在为构想不出空间图形而烦恼吗?还在为高数的曲面积分焦虑吗?当你想到去搜在线绘图APP或网站时,说明你离摆脱烦恼更进一步了呢,互联网的时代为什么不用科技的方法去解决无法手工完成的任务呢。 哈哈哈,不卖关子了&…

Goo3D 3d图片制作网站

Goo3D 3d图片制作网站 这是一个很酷的概念至少看上去很酷,通过三个侧面的图片就可以合成一个3维的物体,不知道这个网站具体做的怎么样 但是忍不住告诉大家,大家或者一起用一下,交流交流 贴一张图片

照片转成3D效果怎么做?建议收藏这些方法

小伙伴们都有看过3D电影吗?它能够让电影画面具有立体效果,使我们观看的时候更有身临其境的感觉。其实现在随着技术的发展,我们也可以做到3D照片制作的操作。那你们知道如何把照片转换成3D吗?想要学习怎么制作3D照片的小伙伴&#…

如何画3D图

如何画出一个漂亮的3D图,下面是一个例子,可以参考这个例子进行修改: import pyvista as pv import numpy as np from numpy import mgrid import matplotlib.pyplot as pltxmin -800. xmax 800. Lx xmax-xmin B0 1 k 1 alpha 2.0*np.p…

制作3D图

今天用AI来制作一张3D图。 打开AI,新建一张A4的大小的图纸。 看工具栏里的矩形工具,点击鼠标有键,里面有个椭圆圆工具,用椭圆工具画出个圆,给它的描边添上黑色,再把圆的描边改到60pt,再用矩形工具画出一个…

制作3D图形

制作3D图形 (撰写时间:5月20日 作者:刘明艳) 我们经常会看见一些3D的图形,这些3D的图形看你起来很酷,接下来我们将用AI来做这些3D效果。 首先选择一个自己喜欢的图形或者字母,用钢笔工具描绘出…