7-1 串的模式匹配(kmp算法) 知识点+练习

2023-05-16

给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出。如果找不到,则输出“Not Found”。

本题旨在测试各种不同的匹配算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据0:小规模字符串,测试基本正确性;
  • 数据1:随机数据,String 长度为 105,Pattern 长度为 10;
  • 数据2:随机数据,String 长度为 105,Pattern 长度为 102;
  • 数据3:随机数据,String 长度为 105,Pattern 长度为 103;
  • 数据4:随机数据,String 长度为 105,Pattern 长度为 104;
  • 数据5:String 长度为 106,Pattern 长度为 105;测试尾字符不匹配的情形;
  • 数据6:String 长度为 106,Pattern 长度为 105;测试首字符不匹配的情形。

输入格式:

输入第一行给出 String,为由英文字母组成的、长度不超过 106 的字符串。第二行给出一个正整数 N(≤10),为待匹配的模式串的个数。随后 N 行,每行给出一个 Pattern,为由英文字母组成的、长度不超过 105 的字符串。每个字符串都非空,以回车结束。

输出格式:

对每个 Pattern,按照题面要求输出匹配结果。

输入样例:

abcabcabcabcacabxy
3
abcabcacab
cabcabcd
abcabcabcabcacabxyz 

输出样例: 

abcabcacabxy
Not Found
Not Found 

 

在正式码代码之前,对于kmp算法,有些概念我们要清晰:


 KMP算法是什么?   对于暴力匹配到底有哪些改进?

答:暴力在刚才匹配的过程中,主串指针回溯了2次,才达到匹配的状态kmp算法,主串指针没有回溯,并且快速达到了匹配状态。
kmp是一种高效的模式匹配算法,它牺牲了一定的空间去保存next数组,提高了我们的匹配效率。kmp算法还能更加智能的移动字符串,让字符串达到匹配状态。 


kmp算法的核心:Next数组,算法:公共前后缀 

next数组是什么?
        是当该字符与主串发生不匹配之后,值对应索引的字符要移动到跟主串不匹配的字符对齐。


算法:公共前后缀
        前面和后面一样的。


找公共前后缀的目的是什么?
        为了找到前后能够匹配的状态

next值=公共前后缀+1 

 


推荐一些bilibili  up主的视频讲解:(众所周知,bilibili是一个学习平台)

KMP算法计算next函数值(教材版,超简单!)icon-default.png?t=LBL2https://www.bilibili.com/video/BV12J411m74v?from=search&seid=15357718169736296010&spm_id_from=333.337.0.0 「天勤公开课」KMP算法易懂版icon-default.png?t=LBL2https://www.bilibili.com/video/BV1jb411V78H?from=search&seid=15357718169736296010&spm_id_from=333.337.0.0

KMP算法之求next数组代码讲解icon-default.png?t=LBL2https://www.bilibili.com/video/BV16X4y137qw?from=search&seid=15357718169736296010&spm_id_from=333.337.0.0 

PS:建议按照所给顺序学习 


代码段:

#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;

int* getNext(char *s)
{
	int len = strlen(s);
	int *next = (int*)malloc(sizeof(int)*len);
	int i=0;  //字符串从0开始 
	int j=-1;  //j为next数组的值,因字符串从0开始,所以j从-1开始为了与字符串位置相对应 
	next[i]=j;  //第一个字符的next数组值恒为-1 
	while(i<len-1)  //next[0]已经赋值,所以循环len-1次 
	{
		if(j==-1 || s[i]==s[j])
		{
			i++;
			j++;
			next[i]=j;
		}else j=next[j];
	}
	
	return next;
}

int kmpMatch(char *String,char *Pattern,int *next)
{
	int i=0;
	int j=0;
	int lenString = strlen(String);
	int lenPattern = strlen(Pattern);
	while(i< lenString && j< lenPattern)
	{
		if(j==-1 || String[i] == Pattern[j]) // j=-1代表Pattern从头开始匹配 
		{
			i++;
			j++;
		}else{
			j=next[j];
		}
	}
	
	if(j==lenPattern)  //代表成功匹配  
		return i-j;  //返回位置 
	else return -1;
}

void StringPrint(char *s,int index)  //为了输出成功匹配后的字符串 
{
	int i=index;
	while(s[i])
	{
		cout<<s[i];
		i++;
	}
	cout<<endl; 
}

int main()
{
	int N,index;
	char *String , *Pattern;
	String = (char*)malloc(sizeof(char)*10e6);
	Pattern = (char*)malloc(sizeof(char)*10e5);
	
	cin>>String;
	cin>>N;
	
	for(int i=0;i<N;i++)
	{
		cin>>Pattern;
		
		int *next = getNext(Pattern);
		
		index=kmpMatch(String,Pattern,next);
		
		if(index==-1)
		{
			cout<<"Not Found"<<endl;
		}else{
			StringPrint(String,index);
		}
	}
	
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

7-1 串的模式匹配(kmp算法) 知识点+练习 的相关文章

  • DVWA靶场搭建

    1 靶场是什么 xff0c 靶场的搭建 在学习web安全的过程中 xff0c 靶场是必不可少的 xff0c 毕竟在计算机界 xff0c 任何理论知识都不如实操 靶场就是人为提供的带有安全漏洞的服务 xff0c 每一个学习者都可以在本地快速搭
  • 用HTML+bootstrap制作个人简历

    用HTML bootstrap制作个人简历 nbsp index html lt DOCTYPE html gt lt html lang en gt lt head gt lt meta charset UTF 8 gt lt meta
  • 蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理

    上节我们讲了中断的外部中断 xff0c 基本的了解了一下中断 xff0c 这一节我们继续来学习中断系统的定时器中断基本原理 xff0c 本节很重要 无论是在比赛中还是在单片机 嵌入式等的学习上都有着很重要的地位 如对本作者有兴趣可以去我主页
  • 关于本地离线API文档大全-Zeal的下载以及使用

    目录 1 先进zeal官网进行下载对应的版本 2 进入点击edit gt preferents 在directory中设置存放文档的地址 3 进入下面的网址 xff0c 按ctrl 43 f查找所需的语言后复制name属性的值 4 下载文档
  • Vue使用Element Plus

    安装 Element Plus 安装组件 npm install element plus save 在main ts中导入UI 导入饿了么UI组件 import ElementPlus from 39 element plus 39 im
  • 带符号数的移位操作

    算数移位时应保持数的符号位不变 xff0c 数值的大小则要发生变化 左移一位相当于该数乘以2 xff0c 右移一位相当于该数除以2 移位运算有算数移位 逻辑移位和循环移位一共3类 xff0c 每种移位有左移和右移之分 1 算数移位 算数移位
  • Linux复制文件时出现权限不够的问题

    只需两步即可 1 ctrl 43 alt 43 t打开一个终端 2 输入命令sudo nautilus并运行 就可以打开一个具有管理员权限的文件管理器 xff0c 即可在不切换到管理员的条件下复制文件了
  • Unsupported class file major version 61

    简介 xff1a illegalargumentexception 不支持的类文件主版本61 xff0c jdk版本过高 1 项目场景 项目场景 xff1a 在maven框架下 xff0c 基于注解的SpringAOP项目 2 运行结果 3
  • 基于ubuntu 下 vim 入门进阶篇之环境和插件的配置2步完美搞定

    前言 xff1a 本文可以帮助你快速从vi新手到vi熟练使用 xff0c 按照文中的步骤可以使你在1小时之内搞定所有的配置和熟悉vi的基本使用 很早之前就接触vi了 xff0c 但是一直没时间弄插件 xff0c 也就使用了vi的基本功能 x
  • 数据库系统概论——非相关子查询和相关子查询详解

    学生表 课程表 学生选课表 学生表 xff1a Student Sno Sname Sex Sage Sdept 学号Sno 姓名Sname 性别Sex 年龄Sage 所在系Sdept 201215121 李勇 男 20 CS 201215
  • Anconda新建python环境

    文章目录 前言一 使用代码形式创建虚拟环境1 创建虚拟环境2 查看虚拟环境3 激活虚拟环境4 包的下载5 删除虚拟环境 二 图形界面创建虚拟环境总结 前言 本文主要解决使用Anconda创建python虚拟环境 提示 xff1a 以下是本篇
  • 副驾驶员copilot VsCode神级插件,新手慎用!!!

    新人慎用 新人慎用 新人慎用 一 xff0c 安装并申请 1 点击拓展 xff0c 搜索copilot 2 选这个 安装后右下角会弹出使用申请 xff0c 点击后会跳转到GitHub上申请 本插件是需要预约的 xff0c 大概一周左右时间就
  • 54-Linux概述

    Linux系统概述 计算机的体系结构 xff1a 计算机由计算机硬件和计算机软件两个部分组成 xff0c 其中计算机软件 Computer Software 可分为系统软件和应用软件 系统软件就是操作系统 xff0c 是其他软件的基础 Li
  • 实验十五 IS-IS协议基本配置

    实验十五 IS IS协议基本配置 IS IS 中间系统到中间系统 协议与OSPF 开放最短路径优先 协议有许多类似之处 xff0c 如都是链路状态的IGP路由协议 xff0c 采用的都SPF路由算法 xff0c 都划分了区域 为了支持大规模
  • 解决终端输出乱码问题

    乱码 代码 应该输出 王啊hello world 但是输出了乱码 原因 出现乱码问题的根本原因是编码与解码 使用了不同 而且不兼容的 标准 xff0c 在国内一般出现在中文的编解码过程中 解决方法 第一步 右击终端边界 xff0c 点击里面
  • Win10安装JDK11过程及配置

    写在前面 新手小白刚开始学习java xff0c 所以我的电脑未曾安装过jdk xff0c 如果是曾经装过的需要卸载旧版本 卸载注意事项 xff1a 1 找到原有文件 xff0c 删除它 2 选择此电脑 xff0c 右击系统属性 xff0c
  • Springboot启动后找不到接口前台报404

    Postman测试404后台没报错 首先考虑 xff1a 接口是不是被spring管理了 xff0c 没有被管理是找不到的 Controller 层是否添加注解 64 RestController 64 RequestMapping 34
  • VC++中for(i = 1; i < (1 << n); i ++)循环语句中 i < (1 << n)的含义

    lt lt 在VC 43 43 里执行的是位的算术左移 比如a 61 1 lt lt 1 就是1的二进制从右向左移一位 有符号位的左移高位相应补0或者1 移n位就是原十进制数的2 n次方 因为VC 43 43 里整型32 所以最多可以移31
  • 基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像

    基于 Debain11 构建 asp net core 6 x 的基础运行时镜像 Linux 环境说明Debian 简介Debian 发行版本关于 Debian 11 Linux 常用基础工具Dockerfile 中 RUN 指令RUN 语
  • C++中cmp()用法

    首先 xff0c 我们来谈谈大名鼎鼎的void qsort void base int nelem int width int fcmp const void const void 它属于C语言标准库函数 xff0c 应该是运用最多的了 x

随机推荐

  • 基于汇编和C语言STM32流水灯依次闪烁

    目录 一 初始化 1 地址映射和寄存器映射 1 1 总线基地址 1 2 外设基地址 1 3 外设寄存器地址 1 4接线 1 4 1 将串口USB转TTL线与stm32核心板连接如图所示 1 4 2 并且要设 BOOT0 与 BOOT1 配置
  • Java中String数组的排序

    使用Java compareToIgnoreCase 方法排序 这个方法我在上一篇文章已经说过如何使用了 xff0c 也说明了它的原理 我们可以看一看 xff1a 点击查看 https blog janyork com index php
  • 一步带你了解C语言中++、--的使用方法!

    一步让你了解C语言中 43 43 的使用方法 xff01 一 前言二 43 43 运算符 1 前缀形式和后缀形式单独使用 xff0c 并未出现在表达式中 2 前缀形式后缀形式放入表达式中 三 代码实现 一 前言 C语言中丰富的运算符和表达式
  • python进阶之路——输出print

    目录 一 概述 二 变量输出 三 格式化输出 1 2 str format xff08 xff09 xff08 1 xff09 索引 xff0c 填充与截取 xff08 2 xff09 类型转换 xff08 3 xff09 格式化数字 xf
  • VMware16安装教程(图文教程)

    目录 前言 一 VMware是什么 xff1f 二 安装步骤 1 下载VMware16安装包 3 常见错误 总结 前言 虚拟技术是一种通过组合或分区现有的计算机资源 xff08 CPU 内存 磁盘空间等 xff09 xff0c 使得这些资源
  • 如何windows子系统Ubuntu20.04.4 LTS安装图形可视化界面VcXsrv以及xfce4

    1 Windows下安装VcXsrv 下载地址 VcXsrv Windows X Server download SourceForge net 自行安装 xff0c 过程中选择 1 One large window 2 Start no
  • 如何在Ubuntu上安装R以及Rstudio

    1 安装R 最开始 xff0c 我是使用Conda安装的r base conda install r base Proceed y n 选择y即可 等待安装完毕 终端输入 R 即可进入R 遇到问题 xff0c home linan yes
  • 如何在Ubuntu上使用Ensemble数据库Biomart预测目标基因可能结合的转录因子

    写在前面 xff0c 不推荐 xff01 不推荐 xff01 真有这个需求 xff0c 用Homer更方便 xff0c Biomart还是用来注释就行了 理由 xff1a Biomart里面Ensemble Regulation数据着实太少
  • 如何在Ubuntu上安装R包之单细胞Seurat

    1 直接安装 xff0c 必然等待时间良久 xff0c 最终大堆报错 xff08 个人经验 大咖肯定都安装好配置文件 xff0c 必然不报错 xff09 BiocManager install 34 Seurat 34 2 所以我们先安装一
  • 洛谷 P1233 木棍加工

    题目描述 一堆木头棍子共有n根 xff0c 每根棍子的长度和宽度都是已知的 棍子可以被一台机器一个接一个地加工 机器处理一根棍子之前需要准备时间 准备时间是这样定义的 xff1a 第一根棍子的准备时间为1分钟 xff1b 如果刚处理完长度为
  • 用opencv使用大恒相机的痛苦经历

    做毕业设计需要用到工业相机 xff0c 之前的IDS需要还了 xff0c 心想买个便宜点的 xff08 毕竟做完毕设就离开实验室了 xff0c 太贵不好 xff09 xff0c 挑了个国产的相机 xff0c 大恒的DH HV3151UC 从
  • Windows子系统Ubuntu LTS 20.04 上snap商店无法使用,以及无法下载微信electronic-wechat如何解决

    其实原因是因为Windows子系统不是第一启动系统 xff0c systemctl 指令无法使用 参照人家的方法 在终端输入下列代码 mkdir caches amp amp cd caches git clone https github
  • Ubuntu下使用优麒麟软件商店下载安装并使用微信

    1 打开优麒麟软件官网 xff0c 找到微信 xff0c 后放是链接 微信 2 点击上图64位下载 xff0c 下载即可 将安装包放入主目录下 xff0c 即 home linan的位置 xff0c 你自己命名的 home user的位置
  • GEO数据库下载的RDS格式打开后报错

    全英文路径正常打开 data lt readRDS 34 D SINGLE PVAT GSE166355 annotatedPVAT Integrated rds 34 点击查看数据报错 报错Error in eval call 34 64
  • UBUNTU20(WSL2)由256G拓展为512G

    1 以管理员身份打开Windows PowerShell 2 输入wsl exe shutdown关闭UBUNTU20 3 找到子系统所在位置 xff0c 大概这样 E WpSystem S 1 5 21 2042826161 220952
  • 从零开始配置sublimetext(c++环境)

    安装sublime text Sublime Text Text Editing Done Right 进入官网安装 xff0c 自己选择一个路径安装即可 安装clang 43 43 编译器 clang 43 43 不知道可以查一下 xff
  • linux--磁盘管理

    目录 x1f95d 磁盘基本管理 x1f36d 添加磁盘 x1f36d 文件系统 x1f36d 磁盘分区方式 x1f349 MBR x1f349 GPT x1f36d 基本命令 x1f95d 磁盘配额 x1f336 xfs配额 x1f336
  • CSP-CCF 202112-1 序列查询 C语言 满分

    include lt stdio h gt include lt string h gt int main int n N i A B 61 0 scanf 34 d d 34 amp n amp N int sum 61 0 for i
  • 【Windows常用快捷键,建议收藏】

    Windows常用快捷键 xff0c 建议收藏 作为一名出色的程序员 xff0c 亦或者是白领工作者 xff0c 乃至正要步入社会的青年们 xff0c 以下盘点的一些快捷键 xff0c 也许能让你的日常生活工作更加便捷 高效 基本快捷方式
  • 7-1 串的模式匹配(kmp算法) 知识点+练习

    给定两个由英文字母组成的字符串 String 和 Pattern xff0c 要求找到 Pattern 在 String 中第一次出现的位置 xff0c 并将此位置后的 String 的子串输出 如果找不到 xff0c 则输出 Not Fo