educoder数据结构 字符串匹配 第2关:实现KMP字符串匹配

news2024/11/15 13:26:16

                                                         本文已收录于专栏

                 🌲《educoder数据结构与算法_大耳朵宋宋的博客-CSDN博客》🌲

任务描述

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

相关知识

第 1 关中实现的朴素的字符串匹配算法在实际应用系统中效率低,而 KMP 字符串匹配算法可以实现高效的匹配。

假设长字符串为t,短字符串为p。为了进行 KMP 匹配,首先需要计算字符串pnext数组,后面实现了计算该数组的函数void KmpGenNext(char* p, int* next)。对于 “abcabcab” ,计算出的next数组如下图:

其中:next[i]给出如下信息:从左到右将p的字符与t的字符进行比对时,若在pi号位置出现不匹配,就将字符串p相对t右移i-next[i]位;若next[i]>=0,则右移后比对位置从next[i]号位置开始,否则从0号位置开始。下图 1 给出了一个匹配示例:

本关涉及两个函数

  1. void KmpGenNext(char* p, int* next)
  2. // 生成p的next数组, next数组长度大于等于字符串p的长度加1。

  1. int KmpFindSubWithNext(char* t, char* p, int* next)
  2. // 从t中查找子串p的第一次出现的位置。
  3. // 若找到,返回出现的位置,否则返回-1。

编程要求

本关的编程任务是补全 step2/kmp.cpp 文件中的KmpGenNext函数,以实现 KMP 字符串匹配。该函数生成给定字符串的next数组,生成算法请你查阅相关资料。

  • 具体请参见后续测试样例。

本关涉及的代码文件 kmp.cpp 的代码框架如下:

 
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "kmp.h"
  4. ///
  5. void KmpGenNext(char* p, int* next)
  6. // 生成p的next数组, next数组长度大于等于字符串p的长度加1
  7. {
  8. // 请在此添加代码,补全函数KmpGenNext
  9. /********** Begin *********/
  10. /********** End **********/
  11. }
  12. int KmpFindSubWithNext(char* t, char* p, int* next)
  13. // 从t中查找子串p的第一次出现的位置
  14. // 若找到,返回出现的位置,否则返回-1
  15. {
  16. int i=0, j=0;
  17. while(p[i]!=0 && t[j]!=0) {
  18. if(p[i]==t[j]) {
  19. i++;
  20. j++;
  21. }
  22. else if (next[i]>=0) {
  23. i = next[i];
  24. }
  25. else {
  26. i=0;
  27. j++;
  28. }
  29. }
  30. if(p[i]==0) return j-i; //found
  31. else return -1; //not found
  32. }

评测说明

本关的测试文件是 step2/Main.cpp ,测试过程如下:

  1. 平台编译 step2/Main.cpp ,然后链接相关程序库并生成 exe 可执行文件;
  2. 平台运行该 exe 可执行文件,并以标准输入方式提供测试输入;
  3. 平台获取该 exe 可执行文件的输出,然后将其与预期输出对比,如果一致则测试通过;否则测试失败。

输入输出格式: 输入格式: 第一行输入母串 第二行输入子串

输出格式: 输出Location: #,其中#是子串在母串中的位置编号

以下是平台对 step2/Main.cpp 的样例测试集: 样例输入: stringabcedf1stringabcdef2stringabcdef3stringabcdef4stringabcdef5stringabcdef6stringabcdef7 stringabcdef7

样例输出: Location: 78


开始你的任务吧,祝你成功!

AC_Code

//字符串 实现文件
//
#include <stdio.h>
#include <stdlib.h>
#include "kmp.h"
/
 
void KmpGenNext(char* p, int* next)
//生成p的next数组, next数组长度大于等于字符串p的长度加1
{
    // 请在此添加代码,补全函数KmpGenNext
    /********** Begin *********/
    next[0]=-1;
	int k=-1;
	for(int i=1;p[i-1]!=0;i++)
	{
		while(k>=0&&p[k]!=p[i-1])
		{
			k=next[k];
			k=k+1;
			if(p[i]==p[k])
			{
				next[i]=next[k];
			}
			else
			{
				next[i=k];
 
			}
		}
	}
    /********** End   *********/
}
 
 
int KmpFindSubWithNext(char* t, char* p, int* next)
//从t中查找子串p的第一次出现的位置
//若找到,返回出现的位置,否则返回-1
{
	int i=0, j=0;
	while(p[i]!=0 && t[j]!=0)	{
		if(p[i]==t[j]) 	{ 
			i++;  
			j++; 
		}
		else  if (next[i]>=0) {
			i = next[i];
		}
		else  { 
			i=0;  
			j++; 
		}
	}
	if(p[i]==0)  return j-i; //found
	else  return -1;  //not found
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/134651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LEETCODE 19. 删除链表的倒数第 N 个结点

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例 3&#xff1a;…

shell流程控制之条件判断练习案列

练习案例1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。2、判断web服务是否运行&#xff08;1、查看进程的方式判断该程序是否运行&#xff0c;2、通过查看端口的方式判断该程序是否运行…

memcpy与memmove函数的区别和实现

1.函数定义 memcpy与memmove都是C语言的库函数&#xff0c;在头文件string.h中&#xff0c;作用是内存拷贝。唯一的区别是&#xff0c;当内存发生局部重叠时&#xff0c;memmove保证了拷贝的结果是正确的&#xff0c;但是memcopy不一定是正确的。但是memcpy比memmove速度快。 …

zookeeper学习笔记3(小滴课堂)

zk集群核心知识之三种角色及其作用&#xff1a; 注册中心的三种模式&#xff1a; 选举核心概念及选举状态&#xff1a; 选举发生的时机及选举算法&#xff1a; zookeeper集群的搭建&#xff1a; 我们先来启动三台虚拟机&#xff1a; 然后我们来修改一下我们的zookeeper配置&a…

Introducing Tome, AI讲演助手

随着ChatGPT进入人们的视野&#xff0c;AI开始在越来越多的领域大展拳脚&#xff0c;近期&#xff0c;一款名为Tome的讲演编辑工具&#xff08;类似幻灯片&#xff09;推出了AI辅助创作的功能&#xff0c; Tome的AI讲演功能可以更轻松地将文本、图像、音频等多种媒体元素融合到…

CPU缓存一致性协议MESI

目录 CPU高速缓存&#xff08;Cache Memory&#xff09; CPU为何要有高速缓存 带有高速缓存的CPU执行计算的流程 目前流行的多级缓存结构 多核CPU多级缓存一致性协议MESI MESI协议缓存状态 MESI状态转换 多核缓存协同操作 单核读取 双核读取 修改数据 同步数据…

“英雄无敌”(一)

注意&#xff1a;在阅读本文前建议观看对应的视频教程&#xff0c;本文主要作为那些对视频教程仍有疑问的学习者的参考资料。且本文的部分内容有些过时&#xff08;如仍使用旧版Unity的动画系统&#xff09;&#xff0c;故直接阅读本文对Unity的学习没有太大意义 视频教程&…

写小论文心得(计算机视觉领域)

简介 这篇博文打算讲一下我写小论文前后的过程&#xff0c;其中有许多地方我觉得对于新手来说还是有很多帮助的&#xff0c;包括我自己也是自己慢慢摸索出来的&#xff0c;希望能对正在准备自己第一篇论文的人有所帮助。 写论文的整个过程我想分为几个阶段&#xff1a; 1.获得…

【深度学习】生成对抗网络(GAN)生成海贼王图像 + PyTorch代码实现

文章目录一、数据集介绍1.1 lufei&#xff08;路飞&#xff09;1.2 luobin&#xff08;罗宾&#xff09;1.3 namei&#xff08;娜美&#xff09;1.4 qiaoba&#xff08;乔巴&#xff09;1.5 shanzhi&#xff08;山智&#xff09;1.6 suolong&#xff08;索隆&#xff09;1.7 wu…

【内核笔记】2022回顾-2023规划

文章目录一、2022博客总结二、2023博客规划三、改进沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 一、2022博客总结 2022年重点优化了&#x1f680;RK3399平台开发入门到精通系列专栏&#xff0c;订阅量突破2100个订阅2022年浏览量破190万2…

《梁启超家书》笔记三——交友取益,或读书取益,也要方面稍多,才有接谈交换,或开卷引进的机会

目录 1、学科选择建议 2、学习 3、所学不可太专向&#xff08;不知道学科外其他方向的了&#xff09; 4、建议欧游实地开开眼界 5、建议结婚前分开两地住 6、毕业后工作看法(分析利弊) 7、处事态度与人生观 1、学科选择建议 我很想你以生物学为主科&#xff0c;因为它是…

Vue(五)

1. 绑定class和style样式 dom里自己拿到节点&#xff0c;改它上面的class样式 shift()移除第一个class属性 push想加哪个class属性都行 59行div知道自己只能用两个样式&#xff0c;四种情况 上面这种不合法&#xff0c;就算把样式加进div也得 样式对象&#xff1a;里面的key绿…

【ElasticSearch7.X】学习笔记(一)

【ElasticSearch7.X】学习笔记一、介绍1.1、ElasticSearch1.2、RESTful1.3、数据格式二、下载安装&#xff08;单机部署&#xff09;2.1、解压文件2.2、修改配置配置2.3、创建用户并授权2.5、启动三、增删查改3.1、 索引操作3.1.1、增加索引3.1.2、查看索引3.1.2.1、查看所有索…

定时任务介绍及X-Job和E-Job简单对比

下面对elastic-Job和xxl-Job做个简单的描述和对比 一、区别 1、XJob环境依赖于mysql&#xff0c;不依赖ZooKeeper&#xff0c; 2、EJob依赖ZooKeeper1、X-Job 侧重的业务实现的简单和管理的方便&#xff0c;学习成本简单&#xff0c; 失败策略和路由策略丰富。推荐使用在“用户…

对elasticsearch的实际应用

有业务需求&#xff0c;要做一个搜索接口&#xff0c;从千万的数据中根据筛选项查到需要的数据 筛选项有 1.学段。高中&#xff0c;初中等 2.学科。数学&#xff0c;语文等 3.专区。同步专区&#xff0c;高考专区等 4.试卷类型。月考卷&#xff0c;期中考试卷等 5.年级。高一&a…

MyBatis-Plus常用注解

常用注解 TableName 在使用MyBatis-Plus实现基本的CRUD时&#xff0c;我们并没有指定要操作的表&#xff0c;只是在Mapper接口继承BaseMapper时&#xff0c;设置了泛型User&#xff0c;而操作的表为user表 由此得出结论&#xff0c;MyBatis-Plus在确定操作的表时&#xff0c;…

基于 Tensorflow 2.x 从零训练花卉图像识别模型

一、数据集准备 本篇文章使用数千张花卉照片作为数据集&#xff0c;共分为5个分类&#xff1a;雏菊&#xff08;daisy&#xff09;、蒲公英&#xff08;dandelion&#xff09;、玫瑰&#xff08;roses&#xff09;、向日葵&#xff08;sunflowers&#xff09;、郁金香&#xf…

ClickHouse中的数据类型

ClickHouse中的数据类型数据类型说明数值类型IntFloatDecimal字符串类型StringFixedStringUUID时间类型DateDateTimeDateTIme64复杂类型ArrayEnumTupleNested特殊类型IPV4GEOBoolean 和 Nullable[参考文章]&#xff1a; ClickHouse &#xff5c; 数据类型介绍 数据类型说明 …

Docker | docker安装portainer详细步骤

portainer是一款容器管理可视化界面&#xff0c;不想在虚拟中使用命令管理容器的小伙伴&#xff0c;可以选择安装portainer对容器进行管理&#xff0c;查看日志、启动、停止容器等非常方便。 1. 搜索portainer镜像 docker search portainer 2. 拉取portainer镜像 docker pull…

[torch]日志记录之SummaryWriter(持更)

参考博文&#xff1a; 《tensorboardX的简单使用》《详解PyTorch项目使用TensorboardX进行训练可视化》《使用TensorBoard检查监控深度学习模型》 一、使用方法 class SummaryWriter(builtins.object)| SummaryWriter(log_dirNone, comment, purge_stepNone, max_queue10, f…