KMP字符串匹配(2)

educoder数据结构 字符串匹配 第2关:实现KMP字符串匹配 任务描述 本关的编程任务是补全 step2/kmp.cpp 文件中的KmpGenNext函数,以实现 KMP 字符串匹配。该函数生成给定字符串的next数组。 相关知识 第 1 关中实现的朴素的字符串匹配算法在实际应用系统中效率低,而 KMP 字符串匹配算法可以实现高效的匹配。 假设长字符串为t,短字符串为p。为了进行 KMP 匹配,首先需要计算字符串p的next数组,后面实现了计算该数组的函数void KmpGenNext(char* p, int* next)。对于 “abcabcab” ,计算 阅读详情

有了(1)中的匹配思想,剩下的问题就是搞定next[i]了,其实也就是求字符串自匹配关系

t1t2…ti-1= tk-i+2tk-i+3…tk(i-1<k),i的最大值,直接用2个循环去求next[i]

当然可以,不过效率不好,特别是字符串t比较长的时候,假设ti满足字符串自

匹配的最大值为m,t1t2…tm= ti-mti-m+1…ti-1 ,next[i] = m+1或者m不存在时

next[i] = 0(i>2),next[0]一般表示为-1,next[1] = 0。我们来看next[i+1]和next[i]的关系,

如果tm+1=ti,显然有next[i+1] = next[i]+1, 否则如果tm+1≠ti,这是第m+1个字符失配

的情况,记j=next[m+1],下次需要比较ti和tj,如果失配j=next[j],继续比较,

直到j==-1或者匹配为止

 字符串t="abababaac"的next值如下表:

 

 a

 b

 a

 b

 a

 b

 a

 a

 c

  i

 0

 1

 2

 3

 4

 5

 6

 7

 8

next[i]

 -1

 0

 0

 1

 2

 3

 4

 5

 1

 

next[i]代码如下

next[0] = -1;

next[1] = 0;

for (i=2; i<tlen; i++){

        j = next[i-1];

        if(t[i-1] == t[j])

              next[i] = next[i-1] + 1;

        else{

               while(j!=0 && t[i-1] != t[next[j]])

                       j = next[j];

               next[i] = next[j]+1;

        }

}

还有种教科书上常用的写法,直接进行比较求next[i],更加简洁

next[0] = -1;

next[1] = 0;

i=1, j=0;

while (i<tlen){

        if (j == -1 || t[i] == t[j]){

                ++i;

                ++j;

                next[i] = j;

        }

        else

                j = next[j];

}

第1关:实现朴素的字符串匹配 and 第2关:实现KMP字符串匹配 样例输入: string tri 样例输出: Location: 1 int FindSubStr(char* t, char* p) /* 从字符串t查找子字符串p。 字符串以数值结尾,例如p="str",那么p[0]='s',p[1]='t',p[2]='r',p[3]=0。 采用朴素的匹配算法。 返回子字符串第一次出现的位置,例如t="string ring",p="ring",则返回2。 若没有找到,则返回-1。 */ { // 请在此添加代码,补全函数FindSubStr /* 阅读详情

相关推荐

ULN2003驱动28BYJ-48步进电机详解(附:51 32代码讲解)

本文介绍了28BYJ-48步进电机的驱动原理以及注意事项,并展示了极简 32 51驱动代码

qq_41818650的博客 1万+

【模板】KMP字符串匹配

模板题:洛谷P3375 暴力的复杂度O(mn) KMP复杂度O( Part 1: 匹配的思路优化: txt表示长串,pat表示短串,目标是在长串中找出短串的所在位置 记: i 为txt下标, j 为pat下标, 均表示当前待判断的位置, 字符串下标从0开始。 If ( txt[i]==pat[j] ){//如果匹配 i++,j++;//就下一位置 } else{//如果不匹配 j=k;//令j=k //其中, k符合:pat[0,k-1]==txt[i-k,i-1] //即pat的长度为k-1的前缀

高斯的博客 314

Unity事件总线第一篇:为什么你的游戏需要一个事件总线?

本文探讨了游戏开发中常见的跨模块调用导致代码强耦合的问题。通过一个攻击按钮触发角色攻击、怪物掉血和血条更新的案例,分析了直接调用方式带来的维护困难、扩展性差和模块重用性低等弊端。文章提出使用事件总线(Event Bus)作为解决方案,通过发布-订阅模式实现模块解耦。重构后的代码中,各模块只需与事件总线交互,彼此不再直接依赖。这种设计使得新增功能(如音效)无需修改现有代码,大大提高了系统的可维护性和扩展性,同时增强了模块的重用性,完美体现了开闭原则。

qq_46348216的博客 1298

数据结构与算法实验4——字符串和数组 7-2 【模板】KMP字符串匹配

数据结构 kmp算法

m0_63040123的博客 1267

【COMSOL超材料和超表面仿真设计】

超材料和超表面的设计通常需要自定义材料属性。在COMSOL中,可以通过定义介电常数和磁导率的张量来模拟超材料的特性。对于超表面,通常需要定义表面阻抗或等效电路模型。

weixin_51101456的博客 1661

【局部规划模块曲线算法】曲线平滑介绍

本文先对轨迹平滑问题做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容(1)适合给移动机器人运动的路径【满足运动学,高阶平滑】(2)高阶的运动学不能够突变的【至少三阶的加速度不能突变,最好四阶的jerk和五阶的snap也不能突变】(3)在转弯的地方不会停下来(4)加减速均衡,节省能量(5)节省时间的。

qq_35635374的博客 5715

7-2 字符串的模式匹配

本题目要求读入两个两个DNA序列A和B,其中A为人的DNA序列,B为病毒的DNA序列,然后判断A中是否出现病毒B(注:病毒的DNA序列为环状)。

weixin_60593311的博客 2136

无线充电Qi协议正向通信FSK的解调设计

常见的FSK解调方法是使用频率锁相环(PLL)来跟踪输入信号中的频率变化。PLL根据输入信号的频率变化来生成数字信号,从而实现FSK信号的解调。本文将详细介绍无线充电Qi协议正向通信FSK的解调设计,并提供相应的源代码。在上述示例代码中,我们首先定义了FSK解调的参数,包括采样率、载波频率、每个比特的持续时间和比特判定阈值。最后,通过比较滤波后的信号与比特判定阈值,我们将解调后的数字数据转换为0和1的序列。请注意,上述代码仅为示例,实际的解调设计可能需要根据具体的应用场景和系统要求进行调整和优化。

IunScala的博客 2443

头歌实训数据结构与算法 - 字符串匹配(第2关:实现KMP字符串匹配)

本关的编程任务是补全文件中的函数,以实现 KMP 字符串匹配。该函数生成给定字符串的next数组。

B5201234的博客 785

Camunda 7.x 系列【62】启动流程实例源码解析

为了更好的了解Camunda,接下来我们简单分析下启动流程实例相关源码

记录知识、锤炼自我 1171

37、免驱动USB双目同步测距3D活体深度检测和RV1126结合V4L开发USB摄像头使用

基本思想:需要使用双目摄像头在rv1126上进行活体检测,然后将画面实时返回到桌面上,记录一下。第二步:刷机rv1126开发板系统和ssh远程连接,见参考目录。第一步:购买可见光的红外摄像头,见参考连接,在PC端测试可用。

sxj731533730 2620

字符串匹配算法2:KMP算法

字符串匹配算法2:KMP算法1. 背景:2. KMP算法思想2.1 KMP思想2.2 匹配位置处理2.3 例子3. 失配函数3.1 什么是失配函数?3.2 next函数3.3 例子3.4 (模式串P)失配函数代码4. KMP算法实现代码例子 1. 背景: 根据暴力方法的缺点,而引出KMP算法的思想。 在暴力匹配方法中,上一次匹配失败,则下一次匹配开始时,主串指针会回溯到i+1,模式串指针会回退到......

哈尼的博客 3069

使用GBIF获取生物多样性数据与GIS的结合

随着全球生物多样性的重要性日益凸显,越来越多的研究人员和保护机构开始利用地理信息系统(GIS)来分析和可视化生物多样性数据。GBIF(全球生物多样性信息设施)作为一个全球性的生物多样性数据库,提供了大量的物种分布和分类信息,为研究人员和保护工作者提供了宝贵的数据资源。本文将介绍如何使用GBIF API获取生物多样性数据,并将其与GIS技术相结合,以便更好地理解和研究生物多样性。利用GIS的强大功能,我们可以在地理空间上可视化物种分布、分析物种多样性的空间格局,并为保护生物多样性提供科学依据。

BnxBackend的博客 1763

字符串匹配,1、暴力匹配,2、kmp匹配

package org.kmp.kmp; /** * 暴力匹配算法 * @author cjj_1 * @date 2020-09-07 9:13 */ public class KmpDemo { public static void main(String[] args) { // String str1 = "尚硅谷 尚硅股你尚硅 尚硅谷你尚硅谷你尚硅谷你好"; // String str2 = "尚硅谷你尚硅谷你"; // int inde

weixin_40128696的博客 161

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

第2关:实现KMP字符串匹配

void KmpGenNext(char* p, int* next); //int KmpFindSub(char* t, char* p); int KmpFindSubWithNext(char* t, char* p, int* next); #include <stdio.h> #include <stdlib.h> #include "kmp.h" int main() { //to test finding the first son string //.

Keep_Trying_Go的博客 2252

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

字符串匹配2:KMP算法

1.原理介绍 假设现在文本串S匹配到i位置,模式串P匹配到j位置。如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++,继续匹配下一个字符;如果j != -1,且当前字符匹配失败(即S[i]!=P[j]),则令i不变,j=next[j]。此举意味着失配时,模式串P相对于文本串S向右移动了j-next[j]位。换言之,当匹配失败时,模式串向右移动的位数为:失配字...

no_heart2019的博客 144

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

『算法』——字符串模式匹配算法2【KMP算法】

KMP算法引言1、概述2、基本思想3、KMP算法——next数组 引言 \quad \quad上一篇讲了BF算法,但是其时间性能比较低? 在每趟匹配不成功时存在大量回溯,没有很好的利用部分匹配成功的结果。比如,匹配不成功时,主串必须回溯到下一个字符,模式串回溯到0,开始一一重新匹配。 那有没有可能主串不回溯,模式串移动呢? 就有了KMP算法 1、概述 \quad \quadKMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫

weixin_45666566的博客 506

字符串匹配的KMP算法(2)

上一篇博客比较浅显易懂,但是讲解也比较少(毕竟都能看懂),这一篇也是转载某大佬的文章,说实话我也没弄懂,emmmm,慢慢研究吧。转载自http://www.cppblog.com/oosky/archive/2006/07/06/9486.html。    KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的...

Baiyi_destroyer的博客 274

头歌(C语言)-数据结构与算法-字符串匹配-第2关:实现KMP字符串匹配

第 1 关中实现的朴素的字符串匹配算法在实际应用系统中效率低,而 KMP 字符串匹配算法可以实现高效的匹配。本关的编程任务是补全 step2/kmp.cpp 文件中的。本关的编程任务是补全 step2/kmp.cpp 文件中的。函数,以实现 KMP 字符串匹配。该函数生成给定字符串的。函数,以实现 KMP 字符串匹配。该函数生成给定字符串的。为了进行 KMP 匹配,首先需要计算字符串。数组,后面实现了计算该数组的函数。,其中#是子串在母串中的位置编号。号位置出现不匹配,就将字符串。的字符进行比对时,若在。

weixin_59436900的博客 1919

KMP-字符串匹配算法 Python 2.7实现

# Python Interpreter: Python 2.7.2 # Function: using KMP search method to find whether string A is in string B # Reference Video: https://www.bilibili.com/video/av11866460 # Author: Qiankun Wang # Dat...

Qiankun Wang的博客 490

【LeetCode 刷题】字符串(2)-字符串匹配(KMP)

此博客为《代码随想录》字符串章节的学习笔记,主要内容为字符串匹配KMP算法相关的题目解析。

Bran_Liu的博客 590

字符串的学习(2)-KMP匹配算法

先看下图: 从图中,我们可以很容易的发现,S不必回溯到S[1]的位置,T也不必回溯到T[0]的位置,因为前面的字符,S和T中都是相等的。如果S不回溯的话,那T该怎么办呢?我们也可以很容易的发现,S中5、6、7号字符和T中0、1、2号字符是相等的。故T直接回溯到T[3]的位置即可。此时我们就省去了很多不必要的回溯和比较。那么这些都是我们从图中直观得出的结论,如果换做其他字符,我们又

acsuperman的博客 228

《漫画算法2》源码整理-4 字符串匹配算法 RK KMP

RK算法 public class RabinKarp { public static int rabinKarp(String str, String pattern) { //主串长度 int m = str.length(); //模式串的长度 int n = pattern.length(); //计算模式串的hash值 int patternCode = hash(pattern);

GarfieldEr007的专栏 286
上一篇: KMP字符串匹配(1)
下一篇: KMP字符串匹配(3)
expp
博客等级 码龄20年 1粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值