首页 > 编程语言 >KMP 算法学习笔记

KMP 算法学习笔记

时间:2024-08-04 16:07:40浏览次数:17  
标签:匹配 s2 s1 笔记 next 算法 KMP 失配

问题引入

给出两个字符串 \(s1\) 和 \(s2\),求出 \(s2\) 在 \(s1\) 中所有出现的位置(出现指 \(s1\) 中存在子串与 \(s2\) 完全相同)。

朴素暴力

不详细介绍,容易发现时间复杂度不优秀。

KMP 算法

思想

在朴素暴力中我们可以发现有很多匹配是不需要再次从头开始重新匹配的,举个例子:

ABABC
ABC

在匹配到第三位时发现失配,朴素做法即转到下一位重新从头匹配,当我们可以发现 AB 是重复的,可以直接从 \(s2\) 的第三位开始继续匹配(注意是 \(s2\)),从而提高效率,这就是 KMP算法的核心思想。

实现

我们可以定义一个 \(next\) 数组,我们先不用知道它是怎么来的,先知道它可以表示失配后可以跳过的字符数。

如:

ABABABCAA
ABABC

\(next\) 数组为 0 0 1 2 0

我们定义 \(i\) 表示 \(s1\) 上的指针,\(j\) 表示 \(s2\) 上的指针,可以发现在匹配到第五位时会失配,此时读取失配上一位的 \(next\) 数组的值为 2,也就表示可以跳过两位匹配,则 \(j\) 赋值为 2(假定字符串下标从 \(0\) 开始),接着往下匹配直至匹配结束。

代码:

void KMP()
{
	int i=0,j=0;
	while(i<len1)
	{
		if(s1[i]==s2[j])i++,j++; // 匹配成功
			elif(j>0)j=Next[j-1]; // 匹配失败则跳过一些字符
				else i++; // s2 的第一个字符就失配
		if(j==len2)cout<<i-j+1<<"\n"; // 匹配成功
	}
}

接下来考虑 \(next\) 数组的计算。

标签:匹配,s2,s1,笔记,next,算法,KMP,失配
From: https://www.cnblogs.com/Wu-ZH/p/18341842

相关文章

  • 寻求 Kadane 求连续子数组最大和的算法的优化和验证
    在此处输入图像描述给定一个由N个整数组成的数组A。您希望将数组划分为不相交的连续子数组以使其良好。如果满足以下条件,则认为数组是好的数组:每个元素恰好属于一个子数组。如果我们将每个子数组替换为子数组值的MEX(排除最小值),则生成的数组将按非降序......
  • Java计算机毕业设计基于协同过滤算法的音乐推荐系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,音乐作为人们日常生活中不可或缺的一部分,其获取方式也经历了从实体唱片到数字音乐的巨大变革。面对海量的音乐资源和日益个......
  • Java计算机毕业设计基于协同过滤算法的体育用品推荐系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网的迅猛发展,电子商务已成为人们购物的主要渠道之一,体育用品市场也不例外。然而,面对海量的体育用品信息和多样化的用户需求,如何高效、精准地......
  • 秒懂斐波那契:算法优化实现21亿级速度突破
    针对斐波那契数列算法进行详细介绍和优化,从最简单的递归方法到更高效的迭代、缓存、动态规划、公式推导和矩阵解法,最终达到了时间复杂度为O(logn)的快速幂矩阵解法来感受算法的神奇之处,最后可以看到如何实现在输入n=2100000000(21亿)时仅耗时0.02毫秒的最佳效果。一、回顾斐波......
  • DLMS/COSEM中的信息安全:加密算法(中)1
    3.3高级加密标准    为了DLMS/COSEM的目的,应使用FIPSPUB197:2001中规定的高级加密标准(AES)。AES在加密或解密操作期间对数据块(块)进行操作。因此,AES被称为分组密码算法。    AES使用128、192或256位密钥以128位数据块加密和解密数据。三个密钥大小是足够的。......
  • Java常用类和数据结构与算法
    1.其他常用类1.1.Math类java.lang.Math提供了一系列静态方法用于科学计算;其方法的参数和返回值一般为double型。如果需要更加强大的数学运算能力,可以使用apachecommons下面的Math类库publicclassTestMath{publicstaticvoidmain(String[]args){S......
  • 2.面试算法-数组之基础过关题
    1.基础过关题1.1数组问题常用思想1.1.1双指针思想我们前面说过数组里的元素是紧紧靠在一起的,不能有空隙,后面的元素就要整体向前移动,同样如果在中间位置插入元素,那么其后的元素都要整体向后移动。很多算法问题需要多次反复移动,比如说连续删除多个元素,这就导致会频繁大......
  • FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
    ​一年一度的毕业季就要到了,毕业设计算是大学生毕业前的最后一个大作业,尤其是计算机相关专业的毕业设计,通常要通过编程开发一个软件,比如开发一个图书馆管理系统,开发一个电商APP等等。一个好的毕业设计可以给作者加分,可以评优,还能获得编程开发的实战经验,所以很有必要认真去做毕业......
  • SQLite库笔记:API函数编程
    本文主要介绍SQLite库的一些核心API函数,和实现数据库增删查改功能的C语言示例程序代码。目录1.API函数原型1.1sqlite3_open1.2sqlite3_close1.3sqlite3_free1.4sqlite3_errmsg1.5sqlite3_exec1.6sqlite3_get_table1.7sqlite3_free_table2.返回码定义3.示......
  • SAP MM学习笔记48 - 负库存的概念,Lot(批次)管理
    上一章讲了SAPMM模块的实地棚卸(库存盘点)。SAPMM学习笔记47-实地棚卸(库存盘点)-CSDN博客本章来继续讲MM的其他内容,负库存和Lot管理。-负库存 负库存在SAP当中是允许的,但是也是严格管理的,有些公司是不允许使用的。 必须要在Customize以及品目当中都设定之后才可......