KMP字符串匹配(1)

数据结构——串中kmp算法求模式串中next函数值 笔记 给定一个模式串,求next[j]值 求解方法: 1.第一位的next值为0 2.第二位的next值为1 后面求解每一位的next值时,根据前一位进行比较 3.第三位的next值:看第二位的模式串为b,对应的next值为1,则将第二位的模式串b与j=1的模式串进行比较,不同,则没有相同的字符串,值为1。 4.第四位的next值:看第三位的模式串为c,对应的next值为1,则将第三位的模式串c与j=1的模式串进行比较,不同,则没有相同的字符串,值为1. 5.第五位的next.. 阅读详情

近日看到一面试题写一个函数从字符串s中查找出子串t,并将t从s中删除。

这是考查KMP匹配算法,以前读书时学KMP总是一知半解,考完试基本都还给老师了,

唯一的印象就是KMP实现了匹配字符串指针不回溯,极大的提高了效率,

最近代码写的少拿此题练练手。

考虑当第k个字符失配的时候,sm+k+1≠tk+1时,有如下关系

sm+1sm+2…sm+k = t1t2…tk

下一次再比较时,指针不回溯,应该比较sm+k+1和t的哪个字符呢?

假设应该和ti比较,那么有如下关系

t1t2…ti-1 = sm+k-i+2sm+k-i+3…sm+k (i-1<k)

t1t2…ti-1 = tk-i+2tk-i+3…tk (i-1<k),这是字符串t自身的匹配关系,

当然这样的i可能不止一个,next[i]就是所有这样i里面的最大值,

i越大也意味着满足t1t2…ti-1 = tk-i+2tk-i+3…tk关系的k-i+2越小,

因此下一个需要比较的就是满足上述条件i的最大值,失配后t往右移动的距离最小,

字符串t第i个字符失配后sm+k+1应该和t的next[i]个字符继续比较。

举个具体例子s=“ababababababc“, t=“abababc“当s[6]=a与t[6]=c失配时,

s[6]应该和t[4]=a继续比较,再失配和t[2]=a比较,而不能先和t[2]=a比较,

这样如果原始字符串s=“ababababc“结果就不对了。

有了上述推理,不难写出匹配代码:

i,j分别指向s,t中某个字符,一直匹配,直到某字符失配后,j=next[j]继续比较,

如果next[j]=-1,表示第一个字符就不匹配,此时++i, 比较s的下一个字符,

tlen-j是字符串中待比较字符个数,循环退出条件是s中剩余字符小于t中待比较字符数。

while(i<=slen-tlen+j){

       if(s[i] == t[j]){

                  ++i;

                  ++j;

                  //find match string, erase it

                  if ( j == tlen){ 

                          strcpy(s+i-tlen, s+i);

                          slen -= tlen;

                          i -= tlen;

                          j = 0;

                  }

         }

         else{

                 if ( (j = next[j]) == -1 ){

                         ++i;

                         j = 0;

                       }

         }

}

 

 

第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 /* 阅读详情

相关推荐

PTA 7-1 字符串模式匹配(KMP)

给定一个字符串 text 和一个模式串 pattern,求 pattern 在text 中的出现次数。text 和 pattern 中的字符均为英语大写字母或小写字母。text中不同位置出现的pattern 可重叠。

m0_63485942的博客 6916

KMP算法中的next函数

KMP算法详解看 http://www.matrix67.com/blog/archives/115    next[i]表示当模式串T[i]与主串失配时,模式串的索引回溯到next[i],主串的索引不变  下面串的下标均从0开始                              -1                                 i==0

跟acm say goodbye 984

H3C设备VRF配置实战:5步搞定多业务网络隔离(附排错技巧)

本文详细介绍了在H3C设备上配置VRF(虚拟路由转发)实现多业务网络隔离的实战方法。通过五步配置流程,从创建VPN-instance、绑定接口到配置独立路由表,帮助网络工程师在单台设备上构建逻辑隔离的企业级网络,并分享了高级路由配置与常见排错技巧。

gold8的专栏 937

模式匹配 KMP算法

#includeiostream>using namespace std;typedef struct String...{    char* str;    int length;};void getString(String s)...{    cin >> s.str;    s.length = strlen(s.str);}void  getNext(String pattarn, 

lesky的专栏 1008

stm32F103定时器使用方法

文章目录1、STM32的Timer简介2、普通定时器TIM2-TIM52.1 时钟来源2.2 计数器模式2.3 编程步骤3、程序源代码4、总结 1、STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8个定时器。 其中TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟

weixin_43582209的博客 4515

HC-05蓝牙模块AT指令配置避坑全记录:从配对失败到稳定主从通信

本文详细记录了HC-05蓝牙模块AT指令配置的全过程,从基础认知到主从通信的稳定实现。涵盖了进入AT模式的方法、关键AT指令详解、主从配对流程及常见故障排除,帮助开发者快速掌握蓝牙串口模块的配置技巧,避免常见配对失败问题。

weixin_42632434的博客 415

KMP算法与优化(串的模式匹配)

KMP算法及优化,串的模式匹配算法。

我爱下午茶 1569

FortiOS路径遍历漏洞CVE-2022-41328实战复现:从环境搭建到漏洞利用全记录

本文深入解析FortiOS路径遍历漏洞CVE-2022-41328,从漏洞背景、影响范围到技术原理进行全面剖析。提供详细的漏洞复现环境搭建步骤和实战利用方法,并给出官方修复方案与临时缓解措施,帮助企业有效防御此类防火墙漏洞风险。

weixin_30485379的博客 522

字符串匹配,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

广工计组实验f2一位全加器

一位全加器实验

weixin_63692154的博客 2847

代码审计工具学习之Seay(安装以及初步认识)

目录 1.1名词解释 1.2代码审计的重要性 1.3代码审计的步骤 1.4代码审计的内容 1.5常见的代码审计工具 2 Seay 2.1什么是Seay 2.2Seay的安装过程 3典型漏洞分析 3.1什么是命令注入漏洞 3.2 如何理解命令注入漏洞 3.3 如何防御命令注入漏洞 4 利用工具对命令注入漏洞进行分析 4.1DVWA靶场命令注入漏洞分析 4.2 Pikachu靶场命令注入漏洞分析 1.1名词解释 软件代码审计是对编程项目中源代码的全面...

weixin_52515588的博客 2万+

字符串匹配算法1-KMP

前面介绍过,字符串搜索一般来说有三种方式,前缀搜索,后缀搜索,子串搜索。KMP使用的是前缀搜索。 假设p的偏移是i,也就是窗口的位置是i,匹配到位置j+1时发现了不匹配。现在的问题是向前移动窗口到什么位置呢?注意要保证不漏掉可能的匹配,而且为了效率,应该尽量的多移动窗口。 先假设窗口移动到了位置k,看看有什么后果,这里i<k≤j+1,大于i好理解,至少移动一个字符嘛,为什么小于等于j...

weixin_30701575的博客 141

C#每日面试题-属性和字段的区别

在C#面试中,“属性(Property)和字段(Field)的区别”是基础且高频的考点。很多初学者会把两者混为一谈,甚至觉得“属性就是加了get/set的字段”,但这种理解只停留在表面。面试考察的核心,是对“封装思想”的理解,以及两者在语法特性、底层实现、实际应用中的本质差异。今天我们从“基础认知→核心差异→底层原理→实际应用→面试避坑”五个层面,把这个知识点讲透,既保证新手能看懂,又能满足面试的深度要求。

Amon的专栏 779

7-1 【模板】KMP字符串匹配

7-1 【模板】KMP字符串匹配 给出两个字符串text和pattern,其中pattern为text的子串,求出pattern在text中所有出现的位置。 为了减少骗分的情况,接下来还要输出子串的前缀数组next。 输入格式: 第一行为一个字符串,即为text。 第二行为一个字符串,即为pattern。 输出格式: 若干行,每行包含一个整数,表示pattern在text中出现的位置。 接下来1行,包括length(pattern)个整数,表示前缀数组next[i]的值,数据间以一个空格分隔,行尾无多余空格

qq_32639797的博客 1525

逆变器、转换器、DCDC、继电器等器件的原理和作用

交流电变成直流电的过程:整流==》滤波==》稳压。

m0_61973119的博客 8028

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

字符串模式匹配-KMP算法(1)

就回退一下,看“ABCDAB"当中有没有可以局部匹配的信息。最长公共串是AB2个长度,然后我们把子串的第2+1个元素后移到当前比对失败的元素的位置上,然后开始和主串比较。如果比到不相同了,就看此时比对好的子串的部分的除去当前和主串不一样的元素,前面的部分进行看,有没有最长公共子串,然后把子串的第(最长公共子串的长度+1)的元素后移到当前比对失败的元素的位置上。

ljy的博客 1254

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

字符串匹配-KMP算法(1)

不难想到,用两层for循环,一个遍历文本串,一个遍历模式串,就可以检测出这个模式串是否在文本串中出现过。但是这种算法的时间复杂度为O(m*n),n就是文本串的长度,m就是模式串的长度。

hahalalaba的博客 381

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

7-1 【模板】KMP字符串匹配 (20 分)

7-1 【模板】KMP字符串匹配 (20 分) 给出两个字符串text和pattern,其中pattern为text的子串,求出pattern在text中所有出现的位置。 为了减少骗分的情况,接下来还要输出子串的前缀数组next。 输入格式: 第一行为一个字符串,即为text。 第二行为一个字符串,即为pattern。 输出格式: 若干行,每行包含一个整数,表示pattern在text中出现的位置。 接下来1行,包括length(pattern)个整数,表示前缀数组next[i]的值,数据间以一个空格分隔,

qq_51802026的博客 2307

【字符串】- 1.kmp模式串匹配

#include<iostream> #include<string> #include<vector> using namespace std; // abcabx // 011123 void print(vector<int> A) { for (int &c : A)cout << c << " ...

嗑盐工作室 133

字符串匹配算法(1)KMP

2017/02/24 本篇针对KMP字符串匹配算法。 概述: 我们匹配字符串的时候,想到的自然是在起始点开始一个一个匹配,这样如果一直进行的话也就是相应的蛮力匹配法。但是,如果可以利用已经匹配过的这些字符串,就可以减少回退,使得可以继续使用。 总体思想: 持续利用已经学习到的信息,将其作为进一步匹配的基础。(一定要注意这个“持续”关键词) (不知道用什么软件可以做出来漂亮的图表,这样就可以直接演示...

围城 342

Java实现KMP字符串匹配算法(1)

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。

2301_79987255的博客 336

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

  举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?  许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。   这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章...

Baiyi_destroyer的博客 248

算法重新出发:1.KMP字符串匹配算法

算法重新出发:1.KMP字符串匹配算法 自从前年疫情之后再没怎么刷题了,现在打算开始准备找实习找工作之类的,记录一下每天的进度。目前是在leetcode上刷题,每刷到忘记的知识点相关题会写一篇新的博客 leetcode 28. 实现 strStr() class Solution { public: int strStr(string haystack, string needle) { int len1 = haystack.length(), len2 = needle.l

Istil 199

字符串匹配1:单模式匹配(BF,RK,Sunday,BM,KMP)

字符串匹配1:单模式匹配(BF,RK,Sunday,BM,KMP)

Xu_Wave 1024

字符串模式匹配算法1 - BF和KMP算法

在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串。模式匹配有多种算法,这里先总结一下BF算法和KMP算法。 注意:本文在讨论字符位置/指针/下标时,全部使用C语法,即下标从0开始。 BF算法 BF(Brute Force)算法也就是传说中的“笨办法”,是一个暴力/蛮力算法。设串S和P的长度分别为m,n,则它在最坏情况下的时间复杂度是O(m...

dengdi8115的博客 377

KMP算法:在字符串s中搜索匹配查找match字符串,如果能找到返回首个匹配位置i,否则返回-1

1)KMP算法的关键是match串的预设数组信息next数组,next数组啥意思呢?next[i]代表:match串的i位置前面,前缀与后缀相匹配的最大长度。next[i]还代表0--i-1范围上第一个与i位置不匹配的位置。 2)然后KMP算法的加速在于舍弃前缀匹配过那段重复对比,是复杂度加速到了o(n) 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值