串的模式匹配之KMP算法实现

概述

函数刻画

主串位置不变,next值就是模式串(子串)比较后应跳转的位置

不同位置

next[j]函数

next由模式串决定,看模式串当前比较位的前串中前后缀相同的个数来得k-1的值,next[当前位]=k+1

小补充

PM值:也称部分匹配值,每一位字符及其之前的字符所能匹配(前后缀相等的字符个数)的最大值。右移位数=当前比较的字符位置-对应的PM值,当PM=0时,右移位数最大。

next数组:是由每位字符对应的PM值右移一位(低位补-1)得到的结果

next数组的值:即当前所求next[j]数组,它是由所有next数组对应值+1修正得到的结果

一般题目需要求的话,最好倒推求:即求next数组的值——>next数组

代码实现

优化next函数

nextval数组

1.将当前字符与其next值对应的字符进行比较,如果不同,则当前字符的nextval与当前字符的next值保持一致

2.如果当前字符与其next值对应的字符相同,再比较next字符与其对应的next的字符进行比较,如果不同,则当前字符的nextval就与其next值对应字符的nextval值相同;否则如果当前字符的next字符与next字符对应的next的字符相同,当前字符的nextval就与其next值对应字符的next值对应的字符的nextval值相同......依次比较

总之,比较后与谁相同,nextval就与谁对应的next值相同,否则与当前比较字符的next值相同

代码实现

区别

代码整合

//串的应用
#define maxsize 100;//类型定义 
typedef struct {//顺序串=串数组+串长 char ch[maxsize+1];//下标从1开始存串 int length; 
}sstring;sstring s;//顺序串 
//串的模式匹配-KMP算法实现//求next数组:
void getnext(sstring t,int next[]){//通过模式串求得next数组的值int i=1;//标记当前比较位置 int j=0; //记录跳转位置 next[1]=0;while(i<t.length){//下标位置合法 :????为啥不能取等号 if(j==0||t.ch[i]==t.ch[j]){//字符匹配 或 开始匹配(因为next[0]位置是不用的,next数组是从1开始存储) ++i;++j;//比较下一个 next[i]=j;//记录当前next的值 }else  j=next[j];// 失配跳转} 
}
//匹配算法 
int KMP(sstring s,sstring t,int next[]){int i=1;//标记主串位置下标int j=1;//标记子串位置下标while(i<=s.length&&j<=t.length){if(j==0||s.ch[i]==t.ch[j]){//字符匹配或第一个字符就失配,指针下移 ++i;++j;}else j=next[j];//不匹配时,子串跳转,主串不变 } if(j>t.length)return i-t.length;//匹配成功,返回首字符在主串中的下标位置 else return 0; 
}//求nextval数组:与求next数组大致相同,只不过需要内嵌多一次比较
void getnextval(sstring t,int nextval[]){int i=1;//记录当前位置int j=0;//记录跳转位置nextval[1]=0; while(i<t.length){if(j==0||t.ch[i]==t.ch[j]){ //字符匹配 或 开始匹配(因为next[0]位置是不用的,next数组是从1开始存储) ++i;++j;//下标后移 //记录当前nextval值 if(t.ch[i]!=t.ch[j]) //后移位置字符不相等nextval[i]=j;//与next值保持一致else nextval[i]=nextval[j];//与相同字符的nextval值保持一致 }else j=nextval[j];//失配跳转}
}

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

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

相关文章

Redis Cluster on K8s 大揭密

之前我们针对 Redis 容器化&#xff0c;做了一些讨论&#xff1a; 《Redis 容器化&#xff0c;是不是个“软柿子”》&#xff0c;业界不乏相关的实践分享&#xff0c;KubeBlocks 也针对 Redis Cluster 做了适配并有对应的解决方案。在 Redis 容器化的过程中&#xff0c;KubeBlo…

【学习AI-相关路程-工具使用-NVIDIA SDK MANAGER==NVIDIA-jetson刷机工具安装使用 】

【学习AI-相关路程-工具使用-NVIDIA SDK manager-NVIDIA-jetson刷机工具安装使用 】 1、前言2、环境配置3、知识点了解&#xff08;1&#xff09;jetson 系列硬件了解&#xff08;2&#xff09;以下大致罗列jetson系列1. Jetson Nano2. Jetson TX23. Jetson Xavier NX4. Jetson…

YouTube广告全教学:形式、投放步骤与技巧(2024年更新)

YouTube作为全球最大的视频分享和观看平台吸引了大量的观众&#xff0c;这一平台以其无与伦比的用户参与度和覆盖范围&#xff0c;重新定义了人们获取与分享知识的方式&#xff0c;同时也为企业开辟了一片前所未有的营销蓝海。 据统计&#xff0c;全球观众平均每天观看 YouTub…

超疏水TiO₂纳米纤维网膜的良好性能

超疏水TiO₂纳米纤维网膜是一种具有特殊性能的材料&#xff0c;它结合了TiO₂的光催化性能和超疏水表面的自清洁、防腐、防污等特性。这种材料在防水、自清洁、油水分离等领域具有广阔的应用前景。 制备超疏水TiO₂纳米纤维网膜的过程中&#xff0c;通过精确控制纺丝溶液的成分…

揭秘前端开发的“薪”机遇

众所周知&#xff0c;华为开发者大会2023&#xff0c;宣布不再兼容安卓&#xff0c;同时宣布了“鸿飞计划”&#xff0c;欲与iOS、安卓在市场三分天下&#xff0c;这对中国国产操作系统而言&#xff0c;具有划时代的意义。 最近有不少前端的开发者来咨询鸿蒙开发&#xff0c;今…

OpenNJet : 下一代云原生应用引擎

本心、输入输出、结果 文章目录 OpenNJet &#xff1a; 下一代云原生应用引擎前言OpenNJet 技术架构安装 OpenNJet为什么有了 OpenNJetOpenNJet 和 NGINX 是什么关系什么是云原生应用引擎&#xff1f;OpenNJet 的有哪些优势OpenNJet 的有哪些优势 OpenNJet 与国产化OpenNJet 使…

Llama 3 超级课堂

https://github.com/SmartFlowAI/Llama3-Tutorial/tree/main 第一节作业 streamlit run web_demo.py /root/share/new_models/meta-llama/Meta-Llama-3-8B-Instruct

一键静音,iPhone勿扰模式助你远离干扰

在现代社会的快节奏生活中&#xff0c;我们时常被各种各样的通知、铃声和提示音所打扰&#xff0c;无法专注地工作或享受宁静的时光。而iPhone的勿扰模式功能&#xff0c;就像是一位贴心的助手&#xff0c;能够一键帮你屏蔽这些干扰&#xff0c;让你在需要的时候拥有一个清静的…

窃鈇逃债,赧然惭愧——“天下共主”周赧王的结局

引子&#xff0c;债台高筑 周赧王五十九年&#xff08;前256年&#xff09;&#xff0c;雒邑王都内&#xff0c;大周第三十七代天子、年近八十的周赧王姬延困坐在王宫内的高台上&#xff0c;愁容满面、沮丧悲切、束手无策&#xff1b;而王宫宫墙外不远处&#xff0c;是一大帮举…

流畅的python-学习笔记_设计模式+装饰器+闭包

策略模式 类继承abc.ABC即实现抽象类&#xff0c;方法可用abc.abstractmethod装饰&#xff0c;表明为抽象方法 装饰器基础 装饰器实际是语法糖&#xff0c;被装饰的函数实际是装饰器内部返回函数的引用 缺点&#xff1a;装饰器函数覆盖了被装饰函数的__name__和__doc__属性…

暗区突围pc版steam叫什么 暗区突围无限steam怎么搜

暗区突围pc版steam叫什么 暗区突围无限steam怎么搜 最近游戏圈热度最高的事件肯定是暗区突围PC版本的上线&#xff0c;在上线之前就惹得各位游戏爱好者们频频侧目&#xff0c;在正式上线之后更是吸引了大批的新玩家老玩家进行游戏。可是许多玩家发现在steam上找不到游戏&…

视频改字祝福/豪车装X系统源码/小程序uniapp前端源码

uniapp视频改字祝福小程序源码&#xff0c;全开源。创意无限&#xff01;AI视频改字祝福&#xff0c;豪车装X系统源码开源&#xff0c;打造个性化祝福视频不再难&#xff01; 想要为你的朋友或家人送上一份特别的祝福&#xff0c;让他们感受到你的真诚与关怀吗&#xff1f;现在…

【Python深度学习(第二版)(1)】什么是深度学习,深度学习与机器学习的区别、深度学习基本原理,深度学习的进展和未来

文章目录 一. 深度学习概念二. 深度学习与机器学习的区别三. 理解深度学习的工作原理1. 每层的转换进行权重参数化2. 怎么衡量神经网络的质量3. 怎么减小损失值 四. 深度学习已取得的进展五. 人工智能的未来 - 不要太过焦虑跟不上 一. 深度学习概念 先放一张图来理解下人工智能…

618必买好物清单来袭,这些数码产品值得你考虑!

是不是很多朋友和我一样&#xff0c;已经迫不及待地为618好物节做好了准备&#xff0c;准备开启一场购物盛宴&#xff01;作为一名资深家居与数码爱好者&#xff0c;每年618好物节时我都会尽情挑选心仪的物品&#xff0c;因此今天我想和大家分享一下我的618购物清单&#xff0c…

智慧校园气象站有哪些优点

TH-XQ4智慧校园气象站具有多种优点&#xff0c;这些优点不仅提升了校园的气象监测能力&#xff0c;还为师生提供了更便捷、准确的气象服务。以下是智慧校园气象站的主要优点&#xff1a; 实时监测与预警&#xff1a;智慧校园气象站能够实时监测校园内的气象参数&#xff0c;如温…

Java--方法的使用

1.1什么是方法 方法顾名思义就是解决问题的办法&#xff0c;在程序员写代码的时候&#xff0c;会遇到很多逻辑结构一样&#xff0c;解决相同问题时&#xff0c;每次都写一样的代码&#xff0c;这会使代码看起来比较绒余&#xff0c;代码量也比较多&#xff0c;为了解决这个问题…

第十三章 计算机网络

这里写目录标题 1.网络设备2.协议簇2.1电子邮件(传输层)2.2地址解析(网际层)2.3DHCP(动态主动配置协议)2.4URL(统一资源定位器)2.5IP地址和子网掩码 1.网络设备 物理层&#xff1a;中继器&#xff0c;集线器(多路中继器) 数据链路层&#xff1a;网桥&#xff0c;交换机(多端口…

软件系统概要设计说明书(实际项目案例整理模板套用)

系统概要设计说明书 1.整体架构 2.功能架构 3.技术架构 4.运行环境设计 5.设计目标 6.接口设计 7.性能设计 8.运行设计 9.出错设计 全文档获取进主页 软件资料清单列表部分文档&#xff08;全套可获取&#xff09;&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&…

ChatGPT4 Turbo 如何升级体验?官网如何使用最新版GPT-4 Turbo?

本文会教大家如何教大家升级自己的GPT4到GPT4 Turbo&#xff0c;同时检验自己的GPT4 Turbo是否是最新版本的GPT-4-Turbo-2024-04-09 说明 新版GPT-4 Turbo再次重夺大模型排行榜王座&#xff0c;超越了Claude 3 Opus。 最新版本的GPT-4 Turbo被命名为GPT-4-Turbo-2024-04-09。…

深度学习之基于Vgg16卷积神经网络书法字体风格识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 书法是中国传统文化的重要组成部分&#xff0c;具有深厚的历史底蕴和独特的艺术魅力。在数字化时代&…