模式匹配(数据结构)

news2024/11/23 14:58:56

朴素模式匹配算法

#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#define MaxSize 255

typedef struct{
	char ch[MaxSize];
	int length;
}SString;

//初始化
SString InitStr(SString &S){
	S.length=0;
	return S;
} 

//给串赋值 
SString SetStr(SString &S){
	char c;
	int i=1;
	scanf("%c",&c);
	while(c!='\n'){
		S.ch[i++]=c;
		S.length++;
		scanf("%c",&c);
	}
	return S;
} 

//朴素模式匹配算法
int Index(SString &S,SString &D){
	int i=1,j=1;
	while(i<=S.length&&j<=D.length){
		if(S.ch[i]==D.ch[j]){//匹配成功 
			++i;
			++j;
		}
		else{//匹配失败 
			i=i-j+2;
			j=1;
		}
	}
	if(j>D.length){
		return i-D.length;
	}
	else return 0;
} 

int main(){
	SString S;//主串 
	SString D; //子串
	InitStr(S);
	InitStr(D);
	printf("输入主串:");
	SetStr(S);
	printf("输入子串:"); 
	SetStr(D);
	printf("-------朴素模式匹配:--------\n");
	int i;
	i = Index(S,D);
	if(i>0) printf("匹配成功,位置是:%d",i);
	else printf("匹配失败");
	return 0;
} 

在这里插入图片描述

KMP算法

#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#define MaxSize 255

typedef struct{
	char ch[MaxSize];
	int length;
}SString;

//初始化
SString InitStr(SString &S){
	S.length=0;
	return S;
} 

//给串赋值 
SString SetStr(SString &S){
	char c;
	int i=1;
	scanf("%c",&c);
	while(c!='\n'){
		S.ch[i++]=c;
		S.length++;
		scanf("%c",&c);
	}
	return S;
} 

//根据子串来求解GetNext
void Get_Next(SString &D,int *next){
	int i=1,j=0;
	next[1]=0;
	while(i<D.length){
		if(j==0||D.ch[i]==D.ch[j]){
			++i;++j;
			next[i]=j;//如果Pi=Pj,则next[j+1]=next[j]+1 
		}
		else{
			j=next[j];
		}
	}
} 

//对next进行优化
void Get_NextVal(SString D,int *next,int *nextval){
	nextval[1]=0;
	for(int j=2;j<D.length;j++){
		if(D.ch[next[j]]==D.ch[j])
			nextval[j]=nextval[next[j]];
		else
			nextval[j]=next[j];
	}
}

//KMP算法 
int Index_KMP(SString &S,SString &D,int *next){
	int i=1,j=1;
	while(i<=S.length&&j<=D.length){
		if(j==0||S.ch[i]==D.ch[j]){
			++i;++j;//继续比较 
		}
		else
			j=next[j];//模式串向右移动 
	}
	if(j>D.length)
		return i-D.length;//匹配成功 
	else
		return 0;
} 

//输出next数组
void PrintNext(SString D,int *next){
	for(int i=1;i<D.length+1;i++){
		printf("%d ",next[i]);
	}
	printf("\n");
} 

int main(){
	SString S;//主串 
	SString D; //子串
	InitStr(S);
	InitStr(D);
	printf("输入主串:");
	SetStr(S);
	printf("输入子串:"); 
	SetStr(D);
	printf("----------------KMP----------------\n");
	int next[D.length+1];
	Get_Next(D,next);
	printf("输出next数组:");
	PrintNext(D,next);
	printf("输出优化后next数组:");
	int nextval[D.length+1];
	Get_NextVal(D,next,nextval);
	PrintNext(D,nextval);
	
	int loc;
	loc=Index_KMP(S,D,next);//使用优化前的next数组 
//	loc=Index_KMP(S,D,nextval);//使用优化后的next数组 
	if(loc>0) printf("匹配成功,位置是:%d",loc);
	else printf("匹配失败");
	return 0;
} 

在这里插入图片描述

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

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

相关文章

【计算机毕设选题推荐】产品管理系统SpringBoot+SSM+Vue

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 基于SpringBoot和SSM的产品管理系统 技术栈 SpringBootSSMVueMySQLMaven 文章目录 一、产品…

pip 安装dgl的问题

在该官网链接找到需要的对应包&#xff1a; 官网链接 安装之后可能的问题&#xff1a; 这个时候应该是网络问题导致的&#xff0c;这个时候可以自行前往网站下载 下载之后安装&#xff1a; 发现缺少依赖 p s u t i l psutil psutil&#xff0c;于是前往官网下载&#xff1a;…

C语言数据类型详解

1、什么是数据类型&#xff1f; 计算机编程语言是用来控制计算机的行为及操作&#xff0c;协助人们解决现实中的问题&#xff0c;其能表达的数据类型也是从实际中提取并抽象出来形成的数据结构描述。 例如&#xff1a;数学中数的基础分类有正整数、负整数、小数等类别&#x…

Linux系统编程:makefile以及文件系统编程

增量编译概念 首先回顾一下我们之前写的各种gcc指令用来执行程序&#xff1a; 可以看见非常繁琐&#xff0c;两个文件就要写这么多&#xff0c;那要是成百上千岂不完蛋。 所以为了简化工作量&#xff0c;很自然的想到了将这些命令放在一起使用脚本文件来一键执行&#xff0c…

Python+requests+Excel数据驱动的接口自动化测试中解决接口间数据依赖

在实际的测试工作中&#xff0c;在做接口自动化过程中往往会遇到接口间数据依赖问题&#xff0c;即API_03的请求参数来源与API_02的响应数据&#xff0c;API_02的请求参数又来源与API_01的响应数据&#xff0c;因此通过自动化方式测试API_03接口时&#xff0c;需要预先请求API_…

Linux下将驱动编译进内核

在开发的过程中&#xff0c;一般都是将驱动编译成模块&#xff0c;然后将其发送到开发板加载驱动进行功能验证&#xff0c;驱动的功能验证没有问题后就可以将其编译进内核了。本文将介绍如何把上一篇文章Linux下设备树、pinctrl和gpio子系统、LED灯驱动实验中的LED驱动编译到内…

[题] 前缀和 (含输入输出的耗时对比)

题目 前缀和 题解 前缀和模板 太简单了就多加了点东西:对比cin cout和scanf printf的耗时对比 代码 #include <iostream> using namespace std; const int N 100010; int n, m; int a[N], s[N]; int main(){scanf("%d%d", &n, &m);//原数组 for (in…

CentOS 挂载新磁盘以及磁盘扩容操作教程

1.搭载新加磁盘 # 查看磁盘 fdisk -l #新盘&#xff08;/dev/sdb&#xff09;创建分区 #虚拟机 fdisk /dev/sdb #阿里云 fdisk /dev/vdb #创建/dev/sdb1为新的PV&#xff08;物理卷&#xff09; 【创建物理卷命令】 #虚拟机 pvcreate /dev/sdb1 #阿里云 pvcreate /dev/vdb1 查…

Air001 ADC内部输入通道温度传感器读取

Air001 ADC内部输入通道温度传感器读取 &#x1f4cb;Air001 内部集成的温度传感器说明 &#x1f58d;温度传感器产生一个随温度线性变化的电压。温度传感器在内部被连接到ADC内部的输入通道上&#xff0c;用于将传感器的输出转换成数字数值。 &#x1f4d3;Air001模拟/ 数字转…

CANdb++数据库操作

CANdb数据库操作 创建工程结构文件夹新建数据库&总线描述节点设置节点创建配置Message属性信号设置节点收发信号 环境变量配置一致性检验数据库工程XVehicle.dbc导入工程文件总结 创建工程结构文件夹 在文件夹X-Vehicle-1下&#xff0c;建立工程目录文件夹CANdb&#xff0…

优雅而高效的JavaScript——模板字面量

&#x1f928;博主&#xff1a;小猫娃来啦 &#x1f928;文章核心&#xff1a;优雅而高效的JavaScript——模板字面量 文章目录 什么是模板字面量使用模板字面量插入变量处理多文本模板字面量的高级应用标签模板字量自定义模板字面量函数 常见应用场景拼接字符串HTML模板SQL查询…

【LeetCode热题100】--347.前K个高频元素

347.前K个高频元素 方法&#xff1a;堆 首先遍历整个数组&#xff0c;并使用哈希表记录每个数字出现的次数&#xff0c;并形成一个「出现次数数组」。找出原数组的前 k 个高频元素&#xff0c;就相当于找出「出现次数数组」的前 k 大的值 利用堆的思想&#xff1a;建立一个小…

tomcat多实例部署jenkins

tomcat多实例部署jenkins 文章目录 tomcat多实例部署jenkins1.简介&#xff1a;2.优缺点&#xff1a;3.工作原理&#xff1a;4.工作流程&#xff1a;5.tomcat多实例部署jenkins流程5.1.环境说明5.2.部署前准备工作5.3.多实例部署tomcat5.4.部署jenkins5.5.创建一个jenkins项目5…

乐高Studio打开Solidworks零件/装配体 (sw另存obj文件)

solidworks 2020 Lego studio / part designer 截至2023-10-13&#x1f382;最新版 文章目录 操作步骤1&#xff09; solidworks 开启 ScanTo3D 功能2&#xff09; 零件 / 装配体 保存至stl格式文件3&#xff09; 以SanTo3D网格文件方式打开stl4&#xff09; 将打开的stl另存为…

销毁二叉树

同样是利用递归的方法——后序遍历 void TreeDestroy(BTNode* root) {if (root NULL){return 0;}TreeDestroy(root->left);TreeDestroy(root->right);free(root);}

React18入门(第四篇)——React中的4种CSS使用方式,CSS Module、CSS-in-Js详解

文章目录 一、普通方式使用CSS1.1 元素内联 style1.2 引入 CSS 文件1.3 类名插件 -- Classnames1.4 注意事项 二、CSS Module2.1 普通 CSS 的问题2.2 CSS Module 的特点2.3 简单使用 三、使用 sass3.1 sass 简介3.2 使用 四、CSS-in-JS4.1 CSS-in-JS 简介4.2 CSS-in-JS 常用工具…

计算机网络 实验七 NAT 和 DHCP 实验

实验目的&#xff1a; 1. 掌握NAT技术的基本原理&#xff0c;熟悉NAT基本配置。 2. 掌握DHCP协议的基本原理&#xff0c;熟悉配置DHCP服务器和中继。 实验过程分析&#xff1a; Nat基本配置 分别写出实验步骤中3&#xff09;、4&#xff09;、6&#xff09;的连通性情况&…

怎样学习C#上位机编程?

怎样学习C#上位机编程&#xff1f; 00001. 掌握C#编程和.NET框架基础。 00002. 学WinForm应用开发&#xff0c;了解控件使用和事件编程。 00003. 熟悉基本数据结构和算法&#xff0c;如链表、栈、队列。 00004. 理解串口通信协议和方法&#xff0c;用于与硬件交互。 00005…

SLAM从入门到精通(数据回放工具之rosbag)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们学习了hector-slam、gmapping slam两种slam方法。当时我们操作的时候&#xff0c;是通过手动操作的方法来建图的。但是这里面可能存在一个…