力扣 28找到字符串中第一个匹配项的下标 KMP算法
思路:
朴素匹配有很多步骤是多余的
KMP算法能够避免重复匹配
KMP算法主要是根据子串生成的next数组作为回退的依据,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。
这里讲一下为什么用模式串的最大公共前后缀求解NEXT数组,参考B站木子喵NEKO的视频【【neko算法课】KMP算法【7期】】 https://www.bilibili.com/video/BV1234y1y7pm/?share_source=copy_web&vd_source=5fc45b3a16cefaa9c36d42d5626cd9e6
用例子思考时,我们可以肉眼看到,需要移动的位置是根据B向后移动几个可以最大化的对齐A(在i之前),意味着找到i前面文本子串(A)与模式子串(B)中重合的部分。
既然i前面都是重合(因为i这里发生了不匹配,前面都匹配),直白说就是一样的,那就不用看文本串了,直接看模式串前后是否有重合的部分,也就是看模式串的最大公共前后缀。如果没看懂可以往下看。
kmp整体上分两步
1计算前缀表
2根据前缀表移动两个指针进行匹配
1计算前缀表,就是求解文本串指针回退的位置,
ps:文本串用i指针,模式串用j指针,
以下分别用A,B代指文本串与模式串。
A串中i指针前面(第一次循环时AB发生不匹配的位置)前,用A子串与B子串代称。
当A,B遇到不匹配的字符时,j指针回退,回退依据是当前不匹配位置前一位最大前后缀的长度,
为什么呢?通俗的说就是,不匹配了,看前面有哪些已经最大化的匹配上了,不匹配位置前一位的next值,代表了B自身前后一致的最大长度,根据前面讲的,A子串等效B子串,也就代表了AB子串前后一致的最大长度,也就代表了A子串的后面与B子串的前面一致的最大长度,也就是B需要向后移动几个字符,而j指针的移动代表着B向后移动,也就是j指针要移动到的位置。
j回退到上次最大化匹配的位置
如果还不匹配,再次查看不匹配位置前一位next的值。
如果匹配,j加一,也就意味着j向后移动一位,i向后移动写在了for循环里。
同时每次更新next[i]
void getNext(string s,vector<int> &next)
{int j = 0;next[0] = 0;for(int i = 1;i<s.size();i++){while(j>0 && s[i] != s[j]) j = next[j-1];if(s[i] == s[j]) j++;next[i] = j;}
}
2 模拟匹配过程
如果不匹配,按着next数组回退j指针,如果匹配,J增一
最后如果j指向了模式串的末尾,说明找到了完整匹配,返回匹配的起始下标
如果没找到返回-1
int strStr(string s,string t)
{if(t.size()==0) return 0;//这里需要初始化next数组,这里用址传递传参给getNext函数vector<int> next(t.size());getNext(t,next);int j = 0;for(int i = 0;i<s.size();i++){
//若果遇到s,t不匹配,按着next表回退while(j>0 && s[i]!=t[j]) j = next[j-1];if(s[i] == t[j]) j++;
//如果j指向t的最后一位,说明前面均匹配成功,那么返回的第一个匹配项是当前i位置减去已经匹配的t的长度,再加一if(j == t.size()) return (i - t.size()+1);}return -1;
}
注:修改了一处传参遇到的问题,涉及值传递、指针传递与地址传递的比较,可以略过。
void getNext(string s,vector<int> &next)
vector<int> next(t.size());
getNext(t,next);
这里string s是值传递,也可以用地址传递
vector<int> &next,必须用地址传递,这样好处相比于值传递与指针传递有三点
1避免不必要的拷贝,调用函数时不用创建next的副本,不会导致额外的时间内存开销
2保持函数接口整洁,引用传递可以直接修改传入的对象,不需要显示的管理内存。
3避免空指针问题,指针传递需要检查指针是否为空,否则运行错误,引用传递无需担心,因为引用会绑定到有效的对象。
因此地址传递是c++中处理复杂参数中常见于推荐的方法。
相关文章:
力扣 28找到字符串中第一个匹配项的下标 KMP算法
思路: 朴素匹配有很多步骤是多余的 KMP算法能够避免重复匹配 KMP算法主要是根据子串生成的next数组作为回退的依据,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。 这里讲一下为什么用模式串的最大公共前后缀…...
JavaScript(10)——匿名函数
匿名函数 没有名字的函数,无法直接使用。 使用方式: 函数表达式立即执行函数 函数表达式 将匿名函数赋值给一个变量,并且通过变量名称进行调用 let fn function(){ 函数体 } 调用: fn() 立即执行函数 语法: (function () {…...
图片上传成功却无法显示:静态资源路径配置问题解析
1、故事的背景 最近,有个学弟做了一个简单的后台管理页面。于是他开始巴拉巴拉撘框架,写代码,一顿操作猛如虎,终于将一个简单的壳子搭建完毕。但是在实现功能:点击头像弹出上传图片进行头像替换的时候,卡壳…...
【转盘案例-弹框-修改Bug-完成 Objective-C语言】
一、我们来看示例程序啊 1.旋转完了以后,它会弹一个框,这个框,是啥, Alert 啊,AlertView 也行, AlertView,跟大家说过,是吧,演示过的啊,然后,我们就用iOS9来做了啊,完成了以后,我们要去弹一个框, // 弹框 UIAlertController *alertController = [UIAlertContr…...
Perl 基础语法
Perl 基础语法 Perl 是一种高级、解释型、动态编程语言,广泛用于CGI脚本、系统管理、网络编程、以及其他领域。Perl 以其强大的文本处理能力和简洁的语法而闻名。本文将详细介绍 Perl 的基础语法,帮助读者快速入门。 1. Perl 变量和数据类型 1.1 变量…...
【嵌入式开发之标准I/O】二进制文件的读写及实验
文本文件和二进制的区别 文本文件和二进制文件的区别主要在于它们的编码方式和数据组织方式。 编码方式:文本文件是基于字符编码的文件,常见的编码有ASCII编码、UNICODE编码等。这些编码将字符映射到特定的二进制值,使得字符可以…...
Arduino学习笔记1——IDE安装与起步
一、IDE安装 去浏览器直接搜索Arduino官网,点击Software栏进入下载界面,选择Windows操作系统: 新版IDE下载不需要提前勾选所下载的拓展包,下载好后直接点击安装即可。 安装好后打开Arduino IDE,会自动开始下载所需的…...
一个注解解决重复提交问题
一、前言 在应用系统中提交是一个极为常见的功能,倘若不加管控,极易由于用户的误操作或网络延迟致使同一请求被发送多次,从而生成重复的数据记录。针对用户的误操作,前端通常会实现按钮的 loading 状态,以阻…...
在qt的c++程序嵌入一个qml窗口
//拖拽一个QQuickWidget c端和qml通信的桥梁 找到qml的main.qml的路径 ui->quickWidget->setSource(QUrl::fromLocalFile("../../../code/main.qml"));// QML 与 Qt Widgets 通信//窗口就成了一个类实例对象pRoot (QObject*)ui->quickWidget->rootObje…...
Vue的依赖注入:组件树中的共享数据与功能
引言 在构建大型前端应用时,组件间的通信和状态共享是一个常见问题。Vue.js 提供了一种类似于 React 的 Context 机制的依赖注入系统,允许开发者在组件树中共享数据和功能。provide 和 inject 是 Vue 依赖注入的两个关键概念。本文将深入探讨 Vue 的依赖注入机制,讨论如何使…...
softmax 函数的多种实现方式 包括纯C语言、C++版本、Eigen版本等
softmax 函数的多种实现方式 包括纯C语言、C版本、Eigen版本等 flyfish 先看这里Softmax函数介绍 版本1 规矩的写法 #include <iostream> #include <vector> #include <algorithm> #include <numeric> #include <cmath>// 计算 softmax 的函…...
R语言学习笔记11-读取csv-xlsx-txt-json-pdf-lua格式文件
R语言学习笔记11-读取csv-xlsx-txt-json-pdf-lua格式文件 读取csv使用base的 read.csv 函数使用 readr 包的 read_csv 函数 读取xlsx使用 xlsx 包的 read.xlsx 函数使用 readxl 包的 read_excel 函数 读取txt使用base的文件读取函数 readLines使用 readr 包的 read_lines 函数 …...
Vue的计算属性和方法有什么区别
Vue中的计算属性(computed)和方法(methods)都是用于处理数据和逻辑的重要特性,但它们之间存在一些关键的区别。以下是两者的主要区别: 1. 缓存性 计算属性:计算属性是基于它们的依赖进行缓存的…...
学生成绩管理系统(C语言)
系统分析 1. 主菜单的实现 2. 增加人员功能的实现 3. 删除数据功能的实现 4. 编辑人员功能的实现 5. 排序功能的实现 6. 输出功能 7. 查找信息功能 具体代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 100000typedef struc…...
C语言 通讯录管理 完整代码
这份代码,是我从网上找的。目前是能运行。我正在读。有些不懂的地方,等下再记录下来。 有些地方的命名,还需要重新写一下。 比如: PersonInfo* info &address_book->all_address[address_book->size]; 应该改为: Perso…...
2024北京国际智能工厂及自动化展览会亮点前瞻
随着“工业创新,智造未来”的浪潮席卷而来,2024年度北京国际智能工厂及自动化与工业装配展览会定于8月1日至3日在中国国际展览中心(顺义新馆)盛大开幕。本次展会汇聚了智能制造与自动化技术的最新成果,通过三展联动的创…...
《网络安全等级保护制度详解》
网络安全等级保护制度是我国网络安全领域的一项重要制度,旨在保障网络安全,维护国家安全、社会秩序和公共利益。 网络安全等级保护制度主要包含以下几个关键方面: 等级划分 根据信息系统在国家安全、经济建设、社会生活中的重要程度ÿ…...
使用Wanderboat AI 来规划到巴黎的旅行计划
Wanderboat AI 平台是一个由 GPT-4 驱动的智能旅行规划工具,旨在通过自然对话和多模式互动,为用户提供个性化的旅行行程。以下是该平台的架构和使用方法: 平台架构 GPT-4 驱动:平台利用 GPT-4 的强大自然语言处理能力&#x…...
基于YOLO8的目标检测系统:开启智能视觉识别之旅
文章目录 在线体验快速开始一、项目介绍篇1.1 YOLO81.2 ultralytics1.3 模块介绍1.3.1 scan_task1.3.2 scan_taskflow.py1.3.3 target_dec_app.py 二、核心代码介绍篇2.1 target_dec_app.py2.2 scan_taskflow.py 三、结语 在线体验 基于YOLO8的目标检测系统 基于opencv的摄像头…...
实验07 接口测试postman
目录 知识点 1 接口测试概念 1.1为什么要做接口测试 1.2接口测试的优点 1.3接口测试概念 1.4接口测试原理和目的 2 接口测试内容 2.1测什么 2.1.1单一接口 2.1.2组合接口 2.1.3结构检查 2.1.4调用方式 2.1.5参数格式校验 2.1.6返回结果 2.2四大块 2.2.1功能逻辑…...
C++常用但难记的语法
模板函数的声明和定义必须在同一个文件中。 C中每一个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,编译器是无法知道,模板类中使用模板类型的对象的所占用的空间的大小的。只有模板被真正使用的时…...
Qt 快速保存配置的方法
Qt 快速保存配置的方法 一、概述二、代码1. QFileHelper.cpp2. QSettingHelper.cpp 三、使用 一、概述 这里分享一下,Qt界面开发时,快速保存界面上一些参数配置的方法。 因为我在做实验的时候,界面上可能涉及到很多参数的配置,我…...
RKE部署k8s
移除docker(非必要) rm -rf /etc/docker rm -rf /run/docker rm -rf /var/lib/dockershim rm -rf /var/lib/docker yum list installed | grep docker yum remove ***rke部署k8s集群 cat > /etc/sysctl.conf << EFO net.ipv4.ip_forward 1 n…...
从0开始的STM32HAL库学习8
PWM控制舵机 配置环境 1. 选择TIM2时钟 2.选择内部时钟模式,打开通道二 3.分频系数PSC:72-1 自动重装寄存器ARR:20000-1 输出比较寄存器 CCR:500~2500( 后面可调整 ) 脉冲选择500后期可以改 编辑代码 调用启动函数 HAL_TIM_PWM_Start(&htim2,TIM_CHANN…...
微信小程序数组绑定使用案例(一)
微信小程序数组绑定案例,修改数组中的值 1.Wxml 代码 <view class"list"><view class"item {{item.ischeck?active:}}" wx:for"{{list}}"><view class"title">{{item.name}} <text>({{item.id}…...
Kudu节点数规划
作者:南墨 一、概述 由于Kudu是Hadoop生态的一部分(虽然它不依赖于Hadoop生态系统),因此大多数实际应用场景需要的不仅仅是Kudu;为了输入数据,可能需要Kafka、StreamSets或Spark Streaming;对…...
flutter 充电气泡
前言: 之前一直看到 有手机充电的时候 有气泡从Type-C 的位置冒泡上来 慢慢上移, 然后和上面的圆圈 会和,感觉还是挺好看的。今天试了下用 Flutter 实现了一版本。大致效果如下,而且气泡 和 气泡直接还可以粘黏 实现原理ÿ…...
【C++】deque以及优先级队列
容器适配器 deque的介绍deque的原理介绍 priority_queue的介绍与使用priority_queue的介绍priority_queue的使用constructor(构造函数)emptypushpoptopsize priority_queue的模拟实现 仿函数何为适配器容器适配器deque的缺陷选择deque作为适配器的理由ST…...
手机如何播放电脑的声音?
准备工具: 有线耳机,手机,电脑,远控软件 1.有线耳机插电脑上 2.电脑安装pc版远控软件,手机安装手机端控制版远控软件 3.手机控制电脑开启声音控制 用手机控制电脑后,打开声音控制,电脑播放视频…...
系统架构设计师教程 第3章 信息系统基础知识-3.6 办公自动化系统(OAS)-解读
系统架构设计师教程 第3章 信息系统基础知识-3.6 办公自动化系统(OAS) 3.6.1 办公自动化系统的概念3.6.1.1 办公活动3.6.1.1 办公自动化的概念 3.6.2 办公自动化系统的功能3.6.2.1 事务处理3.6.2.1.1 单机系统3.6.2.1.2 多机系统 3.6.2.2 信息管理3.6.2.…...
网络公关团队/武汉seo人才
1. 安装SQL SERVER 2008 R2 NATIVE CLIENT, 注意区分CPU是32位还是64位的2. COPY XE2的MIDAS到C:\WINDOWS\SYSTEM32\, 低版本的MIDAS.DLL会报错: invalid package3. 命令行执行 REGSVR32 MIDAS.DLL 注册MIDAS, 必须是XE2的MIDAS.DLL4. 安装所必须的文件: dbxmss.dll, sqlncli10…...
oa系统主要干什么的/郑州网站推广优化
读书会北京:最新第3期05.20下午周爱民 ,张帆于北大举办 (加入读书会交流群,请直接看文末)读书会发动初衷 年后初七在去南昌走亲的火车上,看到了张栋博士发的一条微博,说他假期内读了一两百篇论文…...
工商网站注册公司/下载百度网盘app
原文地址为: python安装numpy和pandas最近要对一系列数据做同比比较,需要用到numpy和pandas来计算,不过使用python安装numpy和pandas因为linux环境没有外网遇到了很多问题就记下来了。首要条件,python版本必须是2.7以上。 linux首…...
品牌高端网站制作机构/佛山做网站的公司哪家好
阿里妹导读:选择有时候比努力重要,真正厉害的人不仅仅是埋头苦干,而是会利用好的思维方式、好的方法,看穿事物的本质,顺势而为,找到事情的最优解,并懂得举一反三。架构师是程序员的目标之一&…...
网站支付页面怎么做的/做网络推广要学些什么
武汉大学计算机学院 2014 年优秀大学生暑期夏令营通知类别:教务 发布人:admin 浏览次数:1717 次 发布时间:2014-06-11 08:08:36一、 夏令营时间、地点及内容安排 时间:7 月 9、10、11 三天 地点:武汉大学计算机学院 内容安排: 第一天上午 营员…...
b2c网站有哪些/seo点击器
这次西安赛,,额,,, 周六: 考完四级去流亭坐飞机,下了飞机又做了三个小时的车 到了酒店,告诉我们下午六点没来的自动取消预定,现在一间房间都没了?…...