KPM算法
概念
KMP(Knuth–Morris–Pratt)算法是一种字符串匹配算法,用于在一个主文本字符串中查找一个模式字符串的出现位置。KMP算法通过利用模式字符串中的重复性,避免无意义的字符比较,从而提高效率。
KMP算法的核心思想是构建一个部分匹配表(Pi表),保存了模式字符串中每个位置的最长公共前后缀的长度。通过Pi表,在匹配过程中,当遇到不匹配的字符时,可以根据Pi表中的信息,跳过一部分不可能匹配的区域,从而减少比较次数。
KMP算法的时间复杂度是O(m + n),其中m为模式字符串的长度,n为主文本字符串的长度。相比于朴素的字符串匹配算法的时间复杂度O(m * n),KMP算法具有较高的效率。
作用:
KMP算法的主要作用是在一个文本串(主串)中查找一个模式串的出现位置。具体来说,KMP算法可以解决以下问题:
-
字符串匹配:给定一个文本串和一个模式串,判断模式串是否在文本串中出现,如果是,返回模式串的起始位置。
-
子串查找:给定一个文本串和一个模式串,找到模式串在文本串中第一次出现的位置。
-
字符串搜索:在一个文本串中查找包含指定关键字的子串。
-
字符串替换:在一个文本串中查找并替换指定的模式串。
-
字符串压缩:将文本串中重复出现的模式串进行压缩,并返回压缩后的结果。
总而言之,KMP算法可以帮助我们高效地处理字符串匹配和搜索问题,减少不必要的比较和回溯操作,提高算法的效率和性能。它在文本处理、搜索引擎、编译器等领域有着广泛的应用。
应用场景
KMP算法在字符串匹配和搜索领域有广泛的应用场景,包括但不限于以下几个方面:
-
文本搜索引擎:KMP算法可以用于实现关键字的搜索和匹配,例如在搜索引擎中根据输入的关键字在文本库中进行快速匹配和搜索。
-
文件编辑器和IDE:KMP算法可以用于文件编辑器和集成开发环境(IDE)中的字符串搜索和替换功能,帮助用户快速定位和修改指定的字符串。
-
字符串查找和过滤:KMP算法可以应用于字符串的快速查找和过滤,比如在大量数据中查找匹配某种模式的字符串,或者过滤掉不符合某种模式的字符串。
-
数据压缩和编码:KMP算法在数据压缩和编码中也有应用,例如在字符串压缩算法中,可以利用KMP算法找到重复的模式串并进行压缩处理。
-
字符串分析和语法分析:KMP算法可以用于字符串分析和语法分析过程中的模式匹配和文本解析,帮助识别和解析特定的语法结构和模式。
总之,KMP算法适用于需要进行高效的字符串匹配和搜索的应用场景,特别是当处理大量文本数据时,能够有效提高算法的效率和性能。
练习题:
28. 找出字符串中第一个匹配项的下标
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle
字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。示例 1:
输入:haystack = “sadbutsad”, needle = “sad” 输出:0 解释:“sad” 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。示例 2:
输入:haystack = “leetcode”, needle = “leeto” 输出:-1 解释:“leeto” 没有在
“leetcode” 中出现,所以返回 -1 。提示:
1 <= haystack.length, needle.length <= 104 haystack 和 needle
仅由小写英文字符组成
暴力解法
class Solution {
public:int strStr(string haystack, string needle) {int len1=haystack.size();int len2=needle.size();int i=0,j=0;while(i<len1 && j<len2){if(haystack[i]==needle[j]){++i,++j;if(j==len2)return i-j;}else{i=i-j+1;j=0;}}return -1;}
};
KMP
class Solution {
public:int strStr(string s, string p) {int n = s.size(), m = p.size();if(m == 0) return 0;//设置哨兵s.insert(s.begin(),' ');p.insert(p.begin(),' ');vector<int> next(m + 1);//预处理next数组for(int i = 2, j = 0; i <= m; i++){while(j and p[i] != p[j + 1]) j = next[j];if(p[i] == p[j + 1]) j++;next[i] = j;}//匹配过程for(int i = 1, j = 0; i <= n; i++){while(j and s[i] != p[j + 1]) j = next[j];if(s[i] == p[j + 1]) j++;if(j == m) return i - m;}return -1;}
};
相关文章:
KPM算法
概念 KMP(Knuth–Morris–Pratt)算法是一种字符串匹配算法,用于在一个主文本字符串中查找一个模式字符串的出现位置。KMP算法通过利用模式字符串中的重复性,避免无意义的字符比较,从而提高效率。 KMP算法的核心思想是…...
全流程GMS地下水数值模拟及溶质(包含反应性溶质)运移模拟技术教程
详情点击公众号链接:全流程GMS地下水数值模拟及溶质(包含反应性溶质)运移模拟技术教程 前言 GMS三维地质结构建模 GMS地下水流数值模拟 GMS溶质运移数值模拟与反应性溶质运移模 详情 1.GMS的建模数据的收集、数据预处理以及格式等ÿ…...
GE D20 EME 10BASE-T电源模块产品特点
GE D20 EME 10BASE-T 电源模块通常是工业自动化和控制系统中的一个关键组件,用于为系统中的各种设备和模块提供电源。以下是可能包括在 GE D20 EME 10BASE-T 电源模块中的一些产品特点: 电源输出:D20 EME 模块通常提供一个或多个电源输出通道…...
游戏工作时d3dcompiler_47.dll缺失怎么修复?5种修复方法分享
游戏提示 d3dcompiler_47.dll 缺失的困扰,相信许多玩家都遇到过。这种情况通常会导致游戏无法正常运行,给玩家带来很大的不便。那么,该如何解决这个问题呢?小编将为大家介绍几种解决方法,希望对大家有所帮助。 首先&am…...
关于激光探测器光斑质心算法在FPGA硬件的设计
目录 0引言 1CCD采集图像质心算法 2基于FPGA的图像质心算法 3仿真结果与分析 4结论 0引言 在一些姿态检测的实际应用中,需要在被测对象上安装激光探测器[1],利用CCD相机捕捉激光光斑来检测观测对象的实际情况,光斑图像质心坐标的提取是图…...
理清SpringBoot CURD处理逻辑、顺序
💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 理清SpringBoot CURD处理逻辑、顺序 Controller(控制器): 控制器接收来自客户端的请求,并负责处理请求的路由和参数解析…...
缓存读写淘汰算法W-TinyLFU算法
在W-TinyLFU中,每个缓存项都会被赋予一个权重。这个权重可以表示缓存项的大小、使用频率、是否是热数据等因素。每次需要淘汰缓存时,W-TinyLFU会选择小于一定阈值的权重的缓存项进行淘汰,以避免淘汰热数据。 另外,W-TinyLFU也会根…...
C++中的 throw详解
在《C++异常处理》一节中,我们讲到了 C++ 异常处理的流程,具体为: 抛出(Throw)--> 检测(Try) --> 捕获(Catch) 异常必须显式地抛出,才能被检测和捕获到;如果没有显式的抛出,即使有异常也检测不到。在 C++ 中,我们使用 throw 关键字来显式地抛出异常,它的用…...
vue 封装Table组件
基于element-plus UI 框架封装一个table组件 在项目目录下的components新建一个Table.vue <template><section class"wrap"><el-tableref"table":data"tableData" v-loading"loading" style"width: 100%":…...
MySQL主从复制错误
当在MySQL的多线程复制中遇到错误时,你可能会看到上述的错误信息。错误的核心在于从服务器上的工作线程在尝试执行一个特定的事务时遇到了问题。 为了解决这个问题,你可以采取以下步骤: 查看MySQL的错误日志:错误日志可能会提供更…...
Redis群集
目录 1、redis群集三种模式 2、Redis 主从复制 2.1 主从复制的作用 2.2 主从复制流程 2.3 搭建Redis 主从复制 3、Redis 哨兵模式 3.1 哨兵模式的作用 3.2 故障转移机制 3.3 主节点的选举 4、Redis 群集模式 4.1 集群的作用 4.2 Redis集群的数据分片 4.3 搭建Redis…...
Spring AOP以及统一处理
一.Spring AOP 1.什么是Spring AOP AOP(Aspect Oriented Programming):面向切面编程,它是一种思想,它是对某一类事情的集中处理。 2.AOP的作用 想象一个场景,我们在做后台系统时,除了登录…...
vue2markdown转思维导图
官网 http://markmap.js.org 按照官网安装markmap-lib,markmap-view两个依赖外,还需要安装markmap-common 如果报错提示vuePdfNoSss相关问题,需要安装vue-pdf 如果报错can’t import the named export ‘xxx’ from non EcmaScript module,需…...
docker下redis备份文件dump.rdb获取
1.查看镜像 docker ps -a 2.进入redis客户端 docker exec -it redis redis-cli 3.保存备份文件 save 4.查看文件存放位置 CONFIG GET dir 5.将docker中文件拷出 docker cp id或name:容器中文件的路径 目标目录地址...
二十一、MySQL(多表)内连接、外连接、自连接实现
1、多表查询 (1)基础概念: (2)多表查询的分类: 2、内连接 (1)基础概念: (2)隐式内连接: 基础语法: select 表1.name,…...
Zookeeper运维
我是一个目录 1. 参数说明2. Zookeeper优化建议3. Zookeeper性能查看4. 建议 1. 参数说明 工作节点瞬间压力大,导致和集群通信出现延迟,被踢出节点,瞬间释放的连接立即又连接到另外节点,最终集群挂掉。加了一些延迟配置后…...
uniapp 点击事件-防重复点击
uniapp 点击事件-防重复点击 1、common文件并创建anti-shake.js文件 // 防止处理多次点击 function noMoreClicks(methods, info) {// methods是需要点击后需要执行的函数, info是点击需要传的参数let that this;if (that.noClick) {// 第一次点击that.noClick f…...
推进“数智+数治”,中期科技智慧公厕驱动城市公厕更新升级发展
随着城市化的快速发展和人口的不断增加,公共厕所这一基础设施的更新升级成为了亟待解决的问题。过去的传统公厕往往存在着环境脏乱差、无法保证使用者的舒适度等诸多问题。而智慧公厕则能够通过互联网和物联网的技术手段,实现智能化的运行管理࿰…...
4、模板(二叉树,红黑树,STL的实现)
1. 泛型编程 2. 模板:参数类型化 3. 模板分类 3.1 函数模板 概念 实例化:隐式实例化,显式实例化 3.2 类模板 4. 在模板参数列表中:class和typename 5.模板参数列表:template <class T , size_t N> 类型参数&#x…...
了解JVM
一.了解JVM 1.1什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟计算机功能来实现的,JVM屏蔽了与具体操作系统平台相关的信息,Java程序只…...
vue2实现组织机构树
参考大佬文章:https://www.cnblogs.com/10ve/p/12573772.html 【vue——实现组织架构图(vue-org-tree)——技能提升 - CSDN App】http://t.csdn.cn/Mpe4B...
JS中BigInt的使用
JS中BigInt的使用 BigInt是一种内置对象,它提供了一种方法来表示大于2^53 - 1的整数,通俗来讲就是提供了一种可以表示任意大整数的方法,当我们使用Number来表示一个超过了2 ^53 - 1的整数的时候,会出错。所以此时我们需要使用Big…...
你的第1个 Unity 游戏!!!
简介 首先新建一个方块添加重力!!!总结首先 首先,你要先打开 U n i t y Unity Unity...
炫云云渲染3ds max效果图渲染教程
很多人在第一次使用炫云云渲染渲染效果图的时候不知道怎么使用,其实现在使用炫云渲染效果图真的很简单,我们一起来看看。 一客户端安装 1、打开炫云云渲染官网,点击右上角的客户端下载,选择炫云客户端(NEXT版…...
Java中数组array和列表list相互转换
在Java中,可以将数组(array)和列表(list)相互转换,但需要注意一些细节和限制。以下是一些示例和说明: 从数组到列表: 使用Arrays.asList()方法:可以使用Arrays.asList()…...
【JavaSE笔记】数据类型与变量
一、前言 在Java这门“啰嗦”的编程语言中,我们必须弄清楚每种数据类型的性质和用途,才能让程序“说人话”。要成为Java高手,就必须与各种数据类型打成一片。 本文则将带你认识Java中常见的两位“角色”—数据类型与变量。 二、数据类型 在Java中数据类型主要分…...
VR全景智慧文旅解决方案,助力文旅产业转型升级
引言: 随着科技的不断发展,虚拟现实(VR)技术正逐渐展露其影响力,改变着旅游业。VR全景智慧文旅解决方案也应运而生,将传统旅游的体验形式从线下扩展到了线上,带来了不一般的文旅体验。 一.VR全…...
采用cv2和默认的人脸识别分类器实现人脸检测功能
人脸识别分类器 haarcascade_frontalface_default 提示:分类器文件地址在这里:https://github.com/opencv/opencv/blob/687fc11626901cff09d2b3b5f331fd59190ad4c7/data/haarcascades/haarcascade_frontalface_default.xml 文章目录 人脸识别分类器 haar…...
C# 实现迷宫游戏
智能提示: /// <summary>/// 迷宫/// </summary>internal class Maze : IDisposable{private MazeCell[,] cells;private readonly Stack<MazeCell> stack new Stack<MazeCell>();private readonly Random rand new Random();private int…...
chales 重写/断点/映射/手机代理/其他主机代理
1 chales 安装和代理配置/手机代理配置/电脑代理配置 chales 安装和代理配置/手机代理配置/电脑代理配置 2 转载:Charles Rewrite重写(详解!必懂系列) Charles Rewrite重写(详解!必懂系列) 1.打开charles,点击菜单栏的Tools选中Rewrite2.…...
wordpress 读书主题/b2b平台是什么意思啊
遍历是访问树的所有节点的过程,也可以打印它们的值。因为所有节点都通过边(链接)连接,所以我们始终从根(头)节点开始。也就是说,我们不能随机访问树中的一个节点。我们用三种方式来遍历一棵树按顺序遍历预购遍历后序遍历按顺序遍历在这种遍历…...
江苏建设会计学会网站/网站是怎么做出来的
一、简述 JavaScript是用来实现浏览器和用户交互的,与html和css不同,它是门弱类型编程语言。 二、引入方式 1、内部标签 <script>代码块 </script>2、外部引入 <script src"js文件路径"></script>三、基础语法 …...
音乐主题资源网站建设/网络营销策略有哪些
原文:https://docs.oracle.com/javase/7/docs/...
wordpress主题阁/外链吧官网
上传文件时,$_FILES里面的name是稳健的名称,要获取扩展名就用 strrchr(str,符号)来截取最后一个.后面的扩展名 然后用 trim 去掉特殊字符. 就可以得到扩展名了转载于:https://www.cnblogs.com/jinshuo/p/6224996.html...
广州至澳门直通巴士乘车点/seo臻系统
主要内容: 分析JavaScript的词法作用域的含义解析变量的作用域链变量名提升时什么一、关于块级作用域 说到JavaScript的变量作用域,与咱们平时使用的类C语言不同. 例如C#中下面代码: static void Main(string[] args){ if(tru…...
wordpress排队加载/百度爱企查电话人工服务总部
随机数在编程中非常重要,有些场合不得不使用随机数,如创建1000个满足0~1正太分布的随机数;有些场合可以避开使用随机数,但人为设置的数字显得呆板,最后还是选择随机数。 1、创建1000个满足0~1正太分布的随机数…...