c语言版数据结构(奇迹冬瓜)-串的匹配模式算法

数据结构(C语言)- 串的KMP模式匹配算法 参考《数据结构(C语言版)》- 严蔚敏 吴伟民 - 清华大学出版社 串的结构定义 typedef unsigned char SString[MAXSTRLEN + 1]; //字符型数组 串的初始化 void Init_String(SString S) { printf("字符串长度:"); scanf_s("%d", &S[0]); printf("\n请输入字符串:");... 阅读详情

[一]传统匹配模式

//-----头文件------
#include<stdio.h>
#include<stdlib.h>

//------宏定义------
#define MAXSTRLEN 255
#define OVERFLOW -2
#define TURE 1
#define ERROR 0

//-------类型名替换--------
typedef unsigned char SString[MAXSTRLEN+1];
typedef int Bool;

//-----函数列表-----
Bool StrAssign(SString *T,char *s);
int Index(SString *S,SString *T,int pos);
void StrOutput(SString S);

//-----主函数做替换测试------
void main()
{
	SString t,*T=&t,s,*S=&s;
	int i;
	StrAssign(T,"abaabcac");
	StrAssign(S,"acabaabaabcacaabc");
	i=Index(S,T,1);
	//StrOutput(s);
	printf("%d\n",i);
	getchar();
	getchar();
}

//------生成一个其值等于字符串常量的串T------
Bool StrAssign(SString *T,char *s)
{
	int i;
	for(i=0;'\0'!=*s;s++,i++)
	{
		(*T)[i+1]=*s;
	}
	(*T)[0]=i;
	return TURE;
}



//-----输出串-----
void StrOutput(SString S)
{
	int i;
	for(i=1;i<=S[0];i++)
	{
		printf("%c",S[i]);
	}
}

int Index(SString *S,SString *T,int pos)
{
	if (1>pos||pos>(*S)[0])
	{
		exit(OVERFLOW);
	}
	int i=pos,j=1;
	while(i<=(*S)[0]&&j<=(*T)[0])
	{
		if((*S)[i]==(*T)[j])
		{
			++i;
			++j;
		}
		else
		{
			i=i-j+2;
			j=1;
		}
	}
	return j>(*T)[0]?i-(*T)[0]:0;
}

[2]KMP匹配模式

//-----头文件------
#include<stdio.h>
#include<stdlib.h>

//------宏定义------
#define MAXSTRLEN 255
#define OVERFLOW -2
#define TURE 1
#define ERROR 0

//-------类型名替换--------
typedef unsigned char SString[MAXSTRLEN+1];
typedef int Bool;

//-----函数列表-----
Bool StrAssign(SString *T,char *s);
int Index_KMP(SString *S,SString *T,int pos);
void get_next(SString *T,int next[]);
void StrOutput(SString S);

//-----主函数做替换测试------
void main()
{
	SString t,*T=&t,s,*S=&s;
	int i;
	StrAssign(T,"abaabcac");
	StrAssign(S,"acabaabaabcacaabc");
	i=Index_KMP(S,T,1);
	//StrOutput(s);
	printf("%d\n",i);
	getchar();
	getchar();
}

//------生成一个其值等于字符串常量的串T------
Bool StrAssign(SString *T,char *s)
{
	int i;
	for(i=0;'\0'!=*s;s++,i++)
	{
		(*T)[i+1]=*s;
	}
	(*T)[0]=i;
	return TURE;
}



//-----输出串-----
void StrOutput(SString S)
{
	int i;
	for(i=1;i<=S[0];i++)
	{
		printf("%c",S[i]);
	}
}

int Index_KMP(SString *S,SString *T,int pos)
{
	int i=pos,j=1,*next;
	if (1>pos||pos>(*S)[0])
	{
		exit(OVERFLOW);
	}
	if (!(next=(int*)malloc((*T)[0]*sizeof(int))))
	{
		exit(OVERFLOW);
	}
	get_next(T,next);
	while(i<=(*S)[0]&&j<=(*T)[0])
	{
		if((*S)[i]==(*T)[j]||0==j)
		{
			++i;
			++j;
		}
		else
		{
			j=next[j];
		}
	}
	return j>(*T)[0]?i-(*T)[0]:0;
}

void get_next(SString *T,int next[])
{
	int i=1,j=0;
	next[1]=0;
	while (i<(*T)[0])
	{
		if (0==j||(*T)[i]==(*T)[j])
		{
			++i;
			++j;
			next[i]=j;
		}
		else
		{
			j=next[j];
		}
	}
}


[3]KMP匹配模式的get_next函数改进

//-----头文件------
#include<stdio.h>
#include<stdlib.h>

//------宏定义------
#define MAXSTRLEN 255
#define OVERFLOW -2
#define TURE 1
#define ERROR 0

//-------类型名替换--------
typedef unsigned char SString[MAXSTRLEN+1];
typedef int Bool;

//-----函数列表-----
Bool StrAssign(SString *T,char *s);
int Index_KMP(SString *S,SString *T,int pos);
void get_nextval(SString *T,int nextval[]);
void StrOutput(SString S);

//-----主函数做替换测试------
void main()
{
	SString t,*T=&t,s,*S=&s;
	int i;
	StrAssign(T,"abaabcac");
	StrAssign(S,"acabaabaabcacaabc");
	i=Index_KMP(S,T,1);
	printf("主串:");
	StrOutput(s);
	printf("\n子串:");
	StrOutput(t);
	printf("\n子串在主串的位置:%d\n",i);
	getchar();
	getchar();
}

//------生成一个其值等于字符串常量的串T------
Bool StrAssign(SString *T,char *s)
{
	int i;
	for(i=0;'\0'!=*s;s++,i++)
	{
		(*T)[i+1]=*s;
	}
	(*T)[0]=i;
	return TURE;
}



//-----输出串-----
void StrOutput(SString S)
{
	int i;
	for(i=1;i<=S[0];i++)
	{
		printf("%c",S[i]);
	}
}

int Index_KMP(SString *S,SString *T,int pos)
{
	int i=pos,j=1,*nextval;
	if (1>pos||pos>(*S)[0])
	{
		exit(OVERFLOW);
	}
	if (!(nextval=(int*)malloc(((*T)[0]+1)*sizeof(int))))
	{
		exit(OVERFLOW);
	}
	get_nextval(T,nextval);
	while(i<=(*S)[0]&&j<=(*T)[0])
	{
		if((*S)[i]==(*T)[j]||0==j)
		{
			++i;
			++j;
		}
		else
		{
			j=nextval[j];
		}
	}
	return j>(*T)[0]?i-(*T)[0]:0;
}

void get_nextval(SString *T,int nextval[])
{
	int i=1,j=0;
	nextval[1]=0;
	while (i<(*T)[0])
	{
		if (0==j||(*T)[i]==(*T)[j])
		{
			++i;
			++j;
			if ((*T)[i]!=(*T)[j])
			{
				nextval[i]=j;
			}
			else
			{
				nextval[i]=nextval[j];
			}
		}
		else
		{
			j=nextval[j];
		}
	}
}




 

告别CPU空转!用STC8的SPI+DMA高效驱动上百颗WS2812B灯珠 本文详细解析了如何利用STC8单片机的SPI+DMA外设高效驱动WS2812B全彩灯珠,解决传统软件延时驱动方式在长灯带应用中的性能瓶颈。通过硬件方案设计、数据格式转换和DMA传输配置,实现高达400Hz的刷新率和低于5%的CPU占用率,适用于大规模灯光项目。 阅读详情

相关推荐

数字IC后端设计实现之Innovus POD V2 Flow性能优化全解析

本文深入解析了数字IC后端设计中的Innovus POD V2 Flow性能优化方案。该流程通过整合place_opt_design与clock_opt_design命令,实现了布局与时钟树的协同优化,有效提升了时序收敛效率、改善了设计密度与拥塞,并显著减少了迭代次数,是应对先进工艺复杂设计的关键利器。

ik6789012的博客 1257

c语言数据结构迷宫算法,c语言版数据结构(奇迹冬瓜)-栈实战(1)栈解迷宫<迷宫算法>...

//c语言版数据结构(奇迹冬瓜)-栈实战(1)栈解迷宫//题目:栈解迷宫//---------头文件---------#include#include//---------宏定义---------#define TRUE 1#define ERROR 0#define OVERFLOW -2//------替换和结构体-------typedef int Status;typedef str...

weixin_42357916的博客 265

告别Link180!在Ansys Mechanical 2020R2中正确启用Cable280绳索单元(附Beta选项开启指南)

本文详细介绍了在Ansys Mechanical 2020R2中启用Cable280绳索单元的全过程,包括Beta选项的开启步骤、建模技巧及高阶应用。Cable280作为专为绳索仿真设计的单元,相比传统的Link180单元,在大变形模拟和计算效率上表现更优,特别适合斜拉桥、电梯牵引绳等工程场景。

weixin_33711647的博客 406

数据结构复习题

若元素a、b、c、d、e、f依次进栈,允许进栈、出栈操作交替进行,但不允许连续3次进行出栈操作,则不可能得到的出栈序列是() A.dcebfa B.cbdaef C.bcaefd D.afedcb 一个栈的入栈序列为1,2,3,……,n,其出栈序列是。若,则可能取值的个数是多少? A.n-3 B.n-2 C.n-1 D.无法确定 假设在树中,结点x是结点y的双亲时,用(x,y)来表示树边。已知一棵树的树边集合为{(e,i), (b,...

MrLiuの甜蜜小屋 2750

Zabbix故障排查10051端口无法启动:zabbix-server.service: main process exited, code=exited, status=1/FAILURE

zabbix-server.service: main process exited, code=exited, status=1/FAILURE报错说与数据库失去连接。

" DevOps菜鸟(Xu JieHao)" 的博客 2258

深入解读ES8388寄存器:从录音到播放,如何用代码控制这颗音频Codec

本文深入解析ES8388音频编解码器的寄存器设置,从录音到播放的完整控制流程。详细介绍了寄存器架构、录音通道配置、播放通道优化以及直通(Bypass)模式的高级应用,帮助开发者通过代码精准控制这颗高性能音频Codec,解决实际开发中的音质问题。

weixin_30275415的博客 551

数据结构之字符串(包含串的模式匹配)

串是由零个或多个字符构成的有限序列,串中字符的个数称为串长。(注意:由空格组成的串不是空串,其串长等于空格的个数。) 串中任意多个连续的字符组成的子序列称为该串的子串。包含子串的串称为主串。 某个字符在串中的序号称为该字符在串中的位置,子串在主串中的位置以子串的第一个字符在主串中的位置来表示。两个串长度相等且每个对应位置的字符都相等时,才称这两个串是相等的。 例如串A='cata ’ 该串的串长是5,t在A中的位置是3 串的逻辑结构和线性表是相同的。二者主要的区别在于串的数据对象只能是字符。而且在基本操作上

m0_51567952的博客 1411

uni-app - 将 base64 图片编码转为 Blob 本地文件路径(把base64类型的图片,转换成blob二进制文件流)适用于 uni-app / vue.js / JavaScript

uni-app/vue.js/JavaScript将base64转Blob,uniappapp端如何将图片的base64编码转换成File对象或Blob,uni-app/vue.js/JavaScript中拿到base64转blob对象,uniapp图片base64格式转blob格式方法,uniapp上传图片压缩转base64码与base64转图片路径,Base64/Blob/File图片文件转换,url、base64、blob相互转换方法,读取本地文件为Base64并转成B

🏆 前端领域优质创作者 1万+

数据结构C语言-串的模式匹配BF算法、KMP算法

#include <stdio.h> #include <stdlib.h> #include <string.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int status; typedef int ElemType; #define MAXLEN 255 typedef stru...

qq_42845341的博客 1084

基于逆向工程的中国裁判文书网爬虫技术深度解析

本文详细介绍了中国裁判文书网爬虫的开发过程,涵盖了从基础爬取到高级功能的完整解决方案。逆向工程分析:理解网站的反爬机制和加密逻辑浏览器自动化:使用Playwright模拟真实用户行为参数加密:通过JavaScript执行环境生成加密参数智能调度:控制请求频率,避免被检测错误处理:完善的异常处理和重试机制。

2201_76125261的博客 2146

python爬取银行年报2

python爬取公司年报(巨潮资讯网)

bboysteed的博客 4731

(游戏编程-01)MFC版坦克大战(奇迹冬瓜)

经过二次整合 重新放出MFC框架下的坦克大战 采用小窗口 多线程 双缓冲 动画帧化 碰撞检测 接口封装 混音 事件延迟等 力求做到代码与美工的双向化

runner2012的专栏 5345

Xilinx FPGA ICAP原语实现多重配置

众所周知,常见的FPGA通常为SRAM结构,固件程序一般存放在外置的串行Flash中,比如SPI Flash,M25P16或N25Q128等。 FPGA启动时,一般先从SPI起始地址开始加载数据到内部的SRAM,加载完成、校验通过则会直接运行。 那么有没有可能在SPI Flash中存放两个或多个FPGA固件呢?

whik1194的博客 4614

c语言版数据结构(奇迹冬瓜)-栈实战(3)括号匹配的检测

//c语言版数据结构(奇迹冬瓜)-栈实战(3)括号匹配的检测 /* 初始化栈 初始化标志位 循环标志位不为1 { 输入一个字符并判断是否为括号 如果是<[{(则进栈 如果是>]})则出栈 { 判断出栈的字符和输入的字符是否相等 { 相等则继续 否则标志位为0 } } 判断栈空否 { 栈空则标志位

runner2012的专栏 1473

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

c语言版数据结构(奇迹冬瓜)-栈实战(4)表达式求值

//c语言版数据结构(奇迹冬瓜)-栈实战(4)表达式求值 /* 这个算法难的不是思想,而是尽可能的解决输入格式的问题 这个程序还有两个问题没有解决可以实现输出负数,但是不能输入负数,一旦输入时括号不匹配会发生错误。 主要思想: 利用两个栈,一个存放字符运算符,一个来存放整数. 其中涉及整数的转换和表达式的格式检测及算符之间的优先级. 本算法还很不工整优化. */ //-----头文件-----

runner2012的专栏 1890

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

串的模式匹配算法之二:首尾匹配算法

usingSystem;namespaceEasyIndex{classIndex{staticvoidMain(string[]args){strings="acabaabcaabaabcac";stringm="abaabcac";inti=0;...

weixin_30809173的博客 374

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数据结构(C语言)串的快速模式匹配KMP算法

KMP算法 KMP算法是D.E.Knuth与V.R.Pratt和J.H.Morris同时发现的,每一趟匹配过程中出现字符比较不等时候,不需要回溯i指针,而是利用已经得到的“部分匹配的结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。 我们先来看几个例子 第一个例子 主串S为:" ACABAABAABCACAABC" 子串T为:" ABAABCAC" 第一次比较:将子串T放在第一位与主串比较,发现子串第二位与主串第二位不等。第二次比较:将子串放T放在上一次不相等的位置,再次进行比较,发现子串第一位就

AtomQQ_2022313691的博客 979

串的模式匹配-----KMP算法与BF算法

t1.手动推算KMP算法2.BF算法代码实现3.KMP算法代码实现3.1求解next数组 1.手动推算KMP算法 KMP算法是BF算法升级版本 BF算法就是暴力搜索,一个一个的去匹配 主串指针所指向的字符:a 模式串指针指向的字符:c 此时不匹配:模式串指针指向开始位置,主串指针指向第二个位置**** 当遇到如下这种情况时候: 太浪费时间了,每次模式串到达最后一个位置才知道匹配失败,并且每次都匹配到模式串的最后一个字符才知道,确实花费时间 所以从而引入KMP算法-----串的模式匹配 KMP算法---

qq_50372003的博客 1209

串的模式匹配算法(KMP算法,BF算法+算法详解+实现代码)

串的模式匹配算法(KMP算法,BF算法+算法详解+实现代码) 子串的定位操作是找子串在主串中从第pos个字符后首次出现的位置,又被称为串的模式匹配 一、BF模式匹配算法 BF算法思想:Brute-Force算法又称蛮力匹配算法(简称BF算法),从主串S的第pos个字符开始,和模式串T的第一个字符进行比较,若相等,则继续比较后续字符;否则回溯到主串S的第pos+1个字符开始重新和模式串T进行比较。以此类推,直至模式串T中的每一个字符依次和主串S中的一个连续的字符序列相等,则称模式匹配成功,此时返回模式串T

冲出仁川,走出马德里,故事还会再继续 2万+

数据结构---串的模式匹配算法介绍

前言 The years teach much which the days never knew. Time:2017/2/19 Name:Willam 1、介绍 对于文本程序来说,找出一个子串在文本中的位置是特别重要的,我们称那个子串为模式串(pattern),然后我们称寻找的过程为:模式匹配(string match)。 2、实现算法(1)—朴素字符串匹配算法 原理:从

William 4万+

(游戏编程-04)JAVA版雷电(奇迹冬瓜)

注:运行环境必须要JDK 先为大家送上游戏截图 接着在最后有代码下载的链接地址 1.游戏开始动画和主界面 关卡与boss 结束画面 代码下载地址 点击打开链接

runner2012的专栏 3826

MFC与坦克大战系列(奇迹冬瓜)---chapter4(坦克总程序代码)

今天是圣诞节。祝大家圣诞快乐。因为今天在尝试写个小的圣诞程序。进度如下。无法控制雪花的路径。 今天会为大家发放整个坦克大战的代码。本来计划再用两节结束的。但是快要期末考试了。等过了这阵。会为大家呈现新的游戏。现在把整个游戏代码发给大家参考。 链接如下。不要积分。 可能我在操作的时候把rc资源有点损坏。可能造成vc打不开的问题。但是主要代码可以用记事本打开。 再次截图 开场动画1

runner2012的专栏 5450

【数据结构与算法】模式匹配——从BF算法到KMP算法(附完整源码)

子串的定位操作通常称为串的模式匹配。模式匹配的应用很常见,比如在文字处理软件中经常用到的查找功能。我们用如下函数来表示对字串位置的定位: int index(const string &Tag,const string &Ptn,int pos) 其中,Tag为主串,Ptn为子串(模式串),如果在主串Tag的第pos个位置后存在与子串Ptn相同的子串,返回它在主串Tag中第pos个字符后第一次出现的位置,否则返回-1。 我们先来看BF算法(Brute-Force,最基本的字符串匹配算法),B

兰亭风雨的专栏 3万+

串的模式匹配算法

串的模式匹配算法 #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;string&gt; #define MaxSize 15 using namespace std; int next[9],nextval[9]; int KMPIndex(string S, int start,stri...

luozhong915127的博客 260

串的模式匹配(BF算法和KMP算法)

BF算法和KMP算法

weixin_43290957的博客 2743

字符串匹配之KMP算法

KMP算法 字符串查找子串

东方吹雪的专栏 2443
上一篇: C编程解线性代数二阶三阶矩阵(奇迹冬瓜)
下一篇: c语言版数据结构(奇迹冬瓜)-数组和广义表(多维数组的基本操作)
utral董东东
博客等级 码龄16年 158粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值