串的模式匹配之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];//失配跳转
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

产品推荐 | 基于Intel (Altera) Cyclone V打造的水星Mercury SA1核心板

01 产品概述 水星Mercury SA1片上系统&#xff08;SoC&#xff09;核心板通过结合基于ARM处理器的SoC FPGA、快速DDR3L SDRAM、eMMC flash、QSPI flash、Gigabit Ethernet PHY和RTC形成了一个高性能嵌入式处理方案&#xff0c;结合了CPU系统的灵活性和FPGA原始的、实时的并行处…

EXCEL——VLOOKUP函数

一、VLOOKUP函数的语法 VLOOKUP(lookup_value,table_array,col_index_num,[range_lookup]) lookup_value 需要在数据表首列进行搜索的值&#xff0c;可以是数值&#xff0c;引用或字符串 table_array 要在其中搜索数据的文字、数字或逻辑值表&#xff0c;可以是对区域或…

自动化测试再升级,大模型与软件测试相结合

近年来&#xff0c;软件行业一直在迅速发展&#xff0c;为了保证软件质量和提高效率&#xff0c;软件测试领域也在不断演进。如今&#xff0c;大模型技术的崛起为软件测试带来了前所未有的智能化浪潮。 软件测试一直是确保软件质量的关键环节&#xff0c;但传统的手动测试方法存…

阿里巴巴中国站关键字搜索API返回值全攻略:精准定位所需商品

当使用阿里巴巴中国站的关键字搜索API时&#xff0c;理解其返回值的结构和内容对于精准定位所需商品至关重要。以下是一份全面的攻略&#xff0c;帮助你更好地利用这个API&#xff1a; 在商品列表中&#xff0c;每个商品对象都包含丰富的信息&#xff0c;以帮助你精准定位所需商…

shell常用文件处理命令

1. 解压 1.1 tar 和 gz 文件 如果你有一个 .tar 文件,你可以使用以下命令来解压: tar -xvf your_file.tar在这个命令中,-x 表示解压缩,-v 表示详细输出(可选),-f 后面跟着要解压的文件名。 如果你的 .tar 文件同时被 gzip 压缩了(即 .tar.gz 文件),你可以使用以下…

PDF文档如何签名?用Adobe信任的文档签名证书

为PDF文档电子签名的方式有多种多样&#xff0c;但并非所有方案都是可靠的。我们在市面看到的电子图章、电子印章等仅在文档中置入印章图片的方式&#xff0c;并不具有任何法律上的有效性&#xff0c;它只是显示印章的图形效果&#xff0c;随时可以被篡改、伪造。PDF文档如何签…

煤矿设备故障ar远程诊断系统缩短时间

深圳华锐视点&#xff0c;一家专注于AR增强现实技术服务的创新型企业&#xff0c;致力于为电商、金融、快消、文创等众多行业赋予AR超能力。我们坚信&#xff0c;AR技术不仅是现实的延伸&#xff0c;更是未来生活的引领者。 在现实与虚拟交织的AR世界中&#xff0c;我们全面开启…

安泰ATA-309C:功率放大器的分类及区别是什么

功率放大器是一种电子器件&#xff0c;用于将低功率信号放大到更高功率&#xff0c;以驱动负载或增强信号强度。功率放大器根据其工作原理、电路拓扑和应用领域的不同&#xff0c;可以分为多种类型。下面将介绍几种常见的功率放大器分类及其区别。 A类功率放大器&#xff1a;A类…

实战Java虚拟机-基础篇

一、基础篇-Java内存区域 1.运行时数据区 运行时数据区-总览 Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。 《Java虚拟机规范》中规定了每一部分的作用。 1.程序计数器 程序计数器&#xff08;Program Counter Register&#xff09;也叫…

鸿蒙——即将是国内全部物联网的搭载系统

国内物联网时代 中国国内物联网时代是指在中国国内&#xff0c;物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;技术得到广泛应用和发展的时代。在这个时代&#xff0c;各种设备和物品都可以通过互联网进行连接和交互&#xff0c;实现信息的采集、传输和…

教程分享:如何为跨境电商、外贸、国际展会制作二维码?

不论是做跨境电商、在全球做产品推广&#xff0c;还是国外的餐厅运营、参加国际展会&#xff0c;或者是做创意户外广告、制作个性化的个人名片、有趣的产品包装……只要是在国外使用二维码&#xff0c;你都可以在QR Tiger去制作您需要的二维码&#xff01; 一、认识QR Tiger 二…

读源码系列文章--开源项目openjob之alarm告警模块

一、背景 告警模块&#xff0c;作为大多数应用都存在的一个基础功能&#xff0c;今天我们就以开源项目openjob 为例&#xff0c;分析其设计及实现。 首先&#xff0c;我们梳理一下需求&#xff1a; 支持多种告警方式&#xff0c;包括钉钉、飞书、微信和webhook。方便业务模块…

C++实现二叉搜索树(模型)

目录 1.二叉搜索树的概念 2.二叉搜索树的实现 2.1总体代码预览 2.2各个函数实现原理 链表结构体 二叉搜索树的成员变量 二叉搜索树的插入 二叉搜索树的查找 二叉搜索树的遍历 二叉搜索树的删除 1.二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#…

CSS中文本样式(详解网页文本样式)

目录 一、Text介绍 1.概念 2.特点 3.用法 4.应用 二、Text语法 1.文本格式 2.文本颜色 3.文本的对齐方式 4.文本修饰 5.文本转换 6.文本缩进 7.color&#xff1a;设置文本颜色。 8.font-family&#xff1a;设置字体系列。 9.font-size&#xff1a;设置字体大小。…

做好源代码防泄密的10条准则

#深度好文计划# 近年来&#xff0c;电脑以及互联网应用在中国的普及和发展&#xff0c;已经深入到社会每个角落&#xff0c; 政府&#xff0c;经济&#xff0c;军事&#xff0c;社会&#xff0c;文化和人们生活等各方面都越来越依赖于电脑和网络。企业需要花费大量的时间精力去…

PC小程序解密及反编译

一、小程序包解密 小程序原始加密包位置C:\Users\administrator\Documents\WeChat Files\Applet\wx234324324324 二、wxappUnpacker反编译 npm install./bingo D:\temp\小程序包解密\wxpack\wx234324324324.wxapkg 三、查看反编译后的文件

Fluence Developer Rewards 国内 每个账号收2000元

# 国内有金主支持 每个账号收2000元 Fluence Developer Rewards account_line 白名单见附件 # 感兴趣的请留言 或加微信 Fluence Developer Rewards This repo allows one to generate a proof signature for Fluence dev reward claiming. 感兴趣 Caution Beware of s…

MapReduce的Shuffle过程

Shuffle是指从 Map 产生输出开始,包括系统执行排序以及传送Map输出到Reduce作为输入的过程. Shuffle 阶段可以分为 Map 端的 Shuffle 阶段和 Reduce 端的 Shuffle 阶段. Shuffle 阶段的工作过程,如图所示: Map 端的 Shuffle 阶段 1&#xff09;每个输入分片会让一个 Map 任务…

STM32F407VET6 学习笔记1:GPIO引脚认识分类与开发板原理图

今日学习STM32F407VET6 &#xff0c;首先从基本原理图、引脚方面开始做个初步理解并整理&#xff1a; 这里使用的学习开发板是在嘉立创购买的 立创梁山派天空星&#xff0c;芯片是 STM32F407VET6 主要对这个芯片的引脚做一些归纳认识、对开发学习板原理图设计进行认识理解:最…

上传文件至linux服务器失败

目录 前言异常排查使用df -h命令查看磁盘使用情况使用du -h --max-depth1命令查找占用空间最大的文件夹 原因解决补充&#xff1a;删除文件后&#xff0c;磁盘空间无法得到释放 前言 使用XFTP工具上传文件至CentOS服务器失败 异常 排查 使用df -h命令查看磁盘使用情况 发现磁盘…