数据结构-串的模式匹配(25分) KMP算法/next数组/KMP的优化

 先记录一个小坑。

int KMP()
{getNext();int i = 0, j = 0;//写成下面这样,结果不对。原因是,当j=-1时,循环条件-1 < strlen(P)被认为是false,会跳出循环while (i < strlen(T) && j < strlen(P)) {if (j == -1 || T[i] == P[j]) { ++i, ++j; }else j = nxt[j];}return i - j;
}

改对的写法

int KMP()
{getNext();int n = strlen(T);int m = strlen(P);int i = 0, j = 0;while (i < n && j < m){if (j == -1 || T[i] == P[j]) { ++i, ++j; }else j = nxt[j];}return i - j;
}

KMP 串的模式匹配


给定两个由英文字母组成的字符串 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

code

# include <iostream>
# include <cstdio>
# include <cstring>char T[1000010]; //文本串
char P[100010]; //目标串
int nxt[100010]; //next数组void getNext()
{nxt[0] = -1; //哨兵:如果与P[0]都失配,那么文本串和模式串就要携手共进一位了for (int i = 0; i < strlen(P) - 1; ++i) //假设[0,i]已填好,现计算nxt[i+1]{int j = i;while (nxt[j] != -1 && P[i] != P[nxt[j]])j = nxt[j];nxt[i + 1] = nxt[j] + 1;}
}int KMP()
{getNext();int n = strlen(T);int m = strlen(P);int i = 0, j = 0;while (i < n && j < m){if (j == -1 || T[i] == P[j]) { ++i, ++j; }else j = nxt[j];}return i - j;
}int main(void)
{scanf("%s", T);int k;scanf("%d", &k);while (k--){scanf("%s", P);int pos = KMP();if (strlen(T) < strlen(P) || pos > strlen(T) - strlen(P)) printf("Not Found\n");else{for (int i = pos; T[i] != '\0'; ++i){printf("%c", T[i]);}printf("\n");}}return 0;
}

7/31更新 优化版void getNext()

void getNext()
{nxt[0] = -1; //哨兵:如果与P[0]都失配,那么文本串和模式串就要携手共进一位了int m = strlen(P);int j = -1;int i = 0;while (i<m-1){if (j==-1 || P[i] == P[j]){++i;++j;nxt[i] = P[i] != P[j] ? j : nxt[j];}else{j = nxt[j];}}
}

结论:没快多少。

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

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

相关文章

【Pycharm2022.2.1】python编辑器最新版安装教程(包含2017-2022的所有版本win/mac/linux)

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 永久安装 Pycharm&#xff08;2017-2022的win/mac/linux所有版本&#xff09;/ IntelliJ IDEA也可以, 按照本文教程所写的&#xff0c;具体步骤跟着下面的图文教程一步一步来就行&#xff0c;一分钟即可搞定&#xff0c;过…

SAP 消息号修改

各个模块的消息号修改&#xff08;转自于网上&#xff09; FI: OBA5|OFMG|OFPM CO: OPR4_ACT|OPR4_CK|OPR4_CKML|OPR4_CKPF|OPR4_KKA|OPR4_KKP|OPR4_KKS| OPR4_KKS1|OPR4_PPCOPP MM: OMRM|OKZZ|OMT4|OMCQ |O04C| SD: OVAH Others: OPR5|OPR1|OPR3|OPR6|OPR7|OPR8|OPR9|OP…

Windows Server 2012 R2 安装 Oracle RAC 11g R2

Windows Server 2012 R2 安装 Oracle RAC 11g R2 环境准备安装系统设置虚拟网络配置虚拟机网卡开机进行系统配置关闭防火墙设置网络系统高级设置修改注册表修改计算机名称设置账户控制RAC1 和 RAC2 的磁盘共享修改 hosts同步时间在 RAC1 RAC2 DATA 中安装 .net3.5在 DATA 中搭建…

MySQL常见问题处理(三)

MySQL 常见问题解决 夕阳留恋的不是黄昏&#xff0c;而是朝阳 上一章简单介绍了MySQL数据库安装(二), 如果没有看过, 请观看上一章 一. root 用户密码忘记&#xff0c;进行重置操作 复制内容来源链接: https://blog.csdn.net/weixin_48927364/article/details/123556927 一.…

开发手册|Java后端开发规范重点条目整理

Ps&#xff1a;部分熟知的开发规范未收录在本文中&#xff01; 一、编程规约 1.1 命名风格 代码中的命名严禁使用拼音与英文混合的方式 alibaba / taobao / youku / hangzhou 等国际通用的名称可视同英文 类名使用大驼峰的形式命名&#xff0c;例如 UpperCameCase 方法、参数…

React 之 Redux - 状态管理

一、前言 1. 纯函数 函数式编程中有一个非常重要的概念叫纯函数&#xff0c;JavaScript符合函数式编程的范式&#xff0c;所以也有纯函数的概念 确定的输入&#xff0c;一定会产生确定的输出 函数在执行过程中&#xff0c;不能产生副作用 2. 副作用 表示在执行一个函数时&a…

《江苏经济报》报道 | 光影逐梦,“苏”写影视工业“诗和远方”企业新闻

近日&#xff0c;《江苏经济报》就蓝海创意云影视动画渲染服务进行了独家专题报道。 云上生产&#xff0c;数字技术创新电影工业流程 三年疫情&#xff0c;不仅阻隔了电影工业产业链上下游资源的对接协作&#xff0c;也放大了产业在地域和行业中人财物资源的不平衡。太湖湖畔的…

jasypt 加密和解密

摘要 博主写作此文时&#xff0c;该软件的最新版本为&#xff1a;Jasypt 1.9.3 RELEASED Jasypt 简介 Jasypt 是一个 Java 库&#xff0c;它允许开发人员以最小的努力为项目添加基本的加密功能&#xff0c;而无需深入了解密码学的工作原理。 Jasypt 特征 Jasypt 提供简单的单…

【Android-java】Parcelable 是什么?

Parcelable 是 Android 中的一个接口&#xff0c;用于实现将对象序列化为字节流的功能&#xff0c;以便在不同组件之间传递。与 Java 的 Serializable 接口不同&#xff0c;Parcelable 的性能更高&#xff0c;适用于 Android 平台。 要实现 Parcelable 接口&#xff0c;我们需…

Jmeter使用总结

文章目录 一、基本使用1.1. 基本使用1.2 主要元件 二、常用场景2.1 切换工具语言2.2 调整jmeter内存2.3 添加请求头2.4 添加断言2.5 添加http默认请求值2.6 基于吞吐量压测2.7 基于文件作为请求参数 一、基本使用 1.1. 基本使用 创建<测试计划>测试计划下添加<线程组…

【分布式系统】聊聊系统监控

对于分布式系统来说&#xff0c;出现故障的是常有的事情&#xff0c;如何在短时间内找到故障的原因&#xff0c;排除故障是非常重要的&#xff0c;而监控系统是就像系统的眼睛可以通过分析相关数据&#xff0c;进一步管理和运维整个分布式系统。 监控系统的的基本功能包含 全…

使用 Simulink 进行 STM32 编程

目录 介绍 所需材料 步骤 1&#xff1a;在MATLAB中设置STM32-MAT软件路径步骤 2&#xff1a;在STM32CubeMX中创建一个项目步骤 3&#xff1a;配置时钟和 GPIO 引脚步骤 4&#xff1a;项目经理并生成代码步骤 5&#xff1a;在 Simulink 中创建模型步骤 6&#xff1a;在模型中插…

【leetcode】24. 两两交换链表中的节点(medium)

给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 /*** Definition for singly-linked list.* public class ListNode {* in…

QT-如何生成唯一ID

在Qt中&#xff0c;我们可以使用QUuid类来生成唯一的ID。QUuid是一个用于操作通用唯一标识符&#xff08;UUID&#xff09;的类&#xff0c;它可以生成符合RFC4122标准的UUID。 以下是一个示例代码&#xff0c;演示了如何使用QUuid生成唯一的ID&#xff1a; #include <QAp…

PHP-简单项目引起的大麻烦--【白嫖项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 首页小插曲小插曲完了么&#xff1f;必要的项目知识PHPThinkPHPThinkPHP的MVCThinkTemplateThinkPHP 6和ThinkPHP 5 phpStudy 设置导数据库展示页面数据库表结构项目目录如图…

ROS版本的ORB-SLAM3用RealSense D455相机实时运行测试

配置环境 1. C11 检查G版本&#xff0c;查看是否支持C11 一般g版本大于4.7即可 g -v 2. Pangolon 地址&#xff1a;https://github.com/stevenlovegrove/Pangolin 先安装OpenGL&#xff0c;Glew ### 编译orb-slam3发现pangolin编译错误排查的环境问题 sudo apt install p…

如何用arduino uno主板播放自己想要的曲子。《我爱你中国》单片机版本。

目录 一.效果展示 二.基本原理 三.电路图 四.代码 一.效果展示 arduino播放《我爱你中国》 二.基本原理 利用arduino uno单片机实现对蜂鸣器振动频率的调节&#xff0c;基于PWM控制系统通过代码实现控制。 三.电路图 四.代码 //main.uno #define Buzzer 2int PotBuffer …

Web3到底是个啥?

Web3是近两年来科技领域最火热的概念之一&#xff0c;但是目前对于Web3的定义却仍然没有形成标准答案&#xff0c;相当多对于Web3的理解&#xff0c;都是建立在虚拟货币行业&#xff08;即俗称的“币圈”&#xff09;的逻辑基础之上的。 区块链服务网络&#xff08;BSN&#x…

paddlenlp:社交网络中多模态虚假媒体内容核查

初赛之环境配置篇 一、背景二、任务三、数据集1、初赛阶段2、评分标准 四、环境操作五、写在最后 一、背景 随着新媒体时代信息媒介的多元化发展&#xff0c;各种内容大量活跃在媒体内中&#xff0c;与此同时各类虚假信息也充斥着社交媒体&#xff0c;影响着公众的判断和决策。…

使用logback记录日志

1. Pom引用依赖 <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> 2. logback.xml <?xml version"1.0" encoding"U…