C++编写算法实现串的置换操作Replace( S, T, R), 即将串S中所有与串T相等的子串置换为串R。

news/2024/11/17 22:46:03/

题目:.编写算法实现串的置换操作Replace( S, T, R), 即将串S中所有与串T相等的子串置换为串R。

实现代码:

#include<iostream>
#include <stdio.h>
using namespace std;
#define MaxSize 100
typedef struct
{	char data[MaxSize];int length;			//串长
} SqString;void StrAssign(SqString &s, char cstr[])	//字符串常量赋给串s
{	int i;for (i = 0; cstr[i] != '\0'; i++)s.data[i] = cstr[i];s.length = i;
}void DestroyStr(SqString &s)
{  }void StrCopy(SqString &s, SqString t)	//串复制
{	int i;for (i = 0; i < t.length; i++)s.data[i] = t.data[i];s.length = t.length;
}bool StrEqual(SqString s, SqString t)	//判串相等
{	bool same = true;int i;if (s.length != t.length)				//长度不相等时返回0same = false;elsefor (i = 0; i < s.length; i++)if (s.data[i] != t.data[i])	//有一个对应字符不相同时返回0{	same = false;break;}return same;
}int StrLength(SqString s)	//求串长
{	return s.length;
}SqString Concat(SqString s, SqString t)	//串连接
{	SqString str;int i;str.length = s.length + t.length;for (i = 0; i < s.length; i++)	//将s.data[0..s.length-1]复制到strstr.data[i] = s.data[i];for (i = 0; i < t.length; i++)	//将t.data[0..t.length-1]复制到strstr.data[s.length + i] = t.data[i];return str;
}SqString SubStr(SqString s, int i, int j)	//求子串
{	SqString str;int k;str.length = 0;if (i <= 0 || i > s.length || j < 0 || i + j - 1 > s.length)return str;					//参数不正确时返回空串for (k = i - 1; k < i + j - 1; k++)  		//将s.data[i..i+j]复制到strstr.data[k - i + 1] = s.data[k];str.length = j;return str;
}SqString InsStr(SqString s1, int i, SqString s2)	//插入串
{	int j;SqString str;str.length = 0;if (i <= 0 || i > s1.length + 1) //参数不正确时返回空串return str;for (j = 0; j < i - 1; j++)      		//将s1.data[0..i-2]复制到strstr.data[j] = s1.data[j];for (j = 0; j < s2.length; j++)		//将s2.data[0..s2.length-1]复制到strstr.data[i + j - 1] = s2.data[j];for (j = i - 1; j < s1.length; j++)		//将s1.data[i-1..s1.length-1]复制到strstr.data[s2.length + j] = s1.data[j];str.length = s1.length + s2.length;return str;
}SqString DelStr(SqString s, int i, int j)		//串删去
{	int k;SqString str;str.length = 0;if (i <= 0 || i > s.length || i + j > s.length + 1) //参数不正确时返回空串return str;for (k = 0; k < i - 1; k++)       		//将s.data[0..i-2]复制到strstr.data[k] = s.data[k];for (k = i + j - 1; k < s.length; k++)	//将s.data[i+j-1..s.length-1]复制到strstr.data[k - j] = s.data[k];str.length = s.length - j;return str;
}SqString RepStr(SqString s, int i, int j, SqString t)	//子串替换
{	int k;SqString str;str.length = 0;if (i <= 0 || i > s.length || i + j - 1 > s.length) //参数不正确时返回空串return str;for (k = 0; k < i - 1; k++)				//将s.data[0..i-2]复制到strstr.data[k] = s.data[k];for (k = 0; k < t.length; k++)   		//将t.data[0..t.length-1]复制到strstr.data[i + k - 1] = t.data[k];for (k = i + j - 1; k < s.length; k++)	//将s.data[i+j-1..s.length-1]复制到strstr.data[t.length + k - j] = s.data[k];str.length = s.length - j + t.length;return str;
}void DispStr(SqString s)	//输出串s
{	int i;if (s.length > 0){	for (i = 0; i < s.length; i++)printf("%c", s.data[i]);printf("\n");}
}void Getbiaohaoxiazhi(SqString t, int nextval[])
{	int j = 0, k = -1;nextval[0] = -1;while (j < t.length){	if (k == -1 || t.data[j] == t.data[k]){	j++;k++;if (t.data[j] != t.data[k])nextval[j] = k;elsenextval[j] = nextval[k];}elsek = nextval[k];}
}int KMPIndex1(SqString s, SqString t)
{	int nextval[MaxSize], i = 0, j = 0;Getbiaohaoxiazhi(t, nextval);while (i < s.length && j < t.length){	if (j == -1 || s.data[i] == t.data[j]){	i++;j++;}elsej = nextval[j];}if (j >= t.length)return (i - t.length);elsereturn -1;
}SqString Repalce(SqString S, SqString T, SqString R)
{	int i, flag = 1; //用于保存与串T相等的S串的下标起始值SqString str, str1; //str 返回值;str1 变动串str.length = 0;StrCopy(str1, S); //在str1上进行改动while (flag){	i = KMPIndex1(str1, T);if (i == -1){	flag = 0;break;//串S中没有与T相等的子串,退出}str = Concat(str, SubStr(str1, 1, i)); //第一次时将str1之前的字符连接在str上;第一次以后因为有修改str1.str = Concat(str, R); //连接替换内容StrCopy(str1, SubStr(str1, i + T.length + 1, str1.length - (i + T.length))); //将i+T.length之前的字符删去}str = Concat(str, str1); //循环中找不到等于T的子串后,将剩下的str1加到str尾部return str;
}int main()
{	SqString S, T, R;char s[] = "我拿红豆比作友情,你拿红豆比作爱情。";char t[] = "红豆";char r[] = "长亭";StrAssign(S, s);StrAssign(T, t);StrAssign(R, r);SqString str;printf("串S:");DispStr(S);printf("串T:");DispStr(T);printf("串R:");	DispStr(R);str = Repalce(S, T, R);printf("替换后:");	DispStr(str);return 0;
}


http://www.ppmy.cn/news/1049955.html

相关文章

数据结构 - 线性表的顺序存储

一、顺序存储定义&#xff1a; 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中。简言之&#xff0c;逻辑上相邻&#xff0c;物理上也相邻顺序表中&#xff0c;任一元素可以随机存取&#xff08;优点&#xff09; 二、顺序表中元素存储位置的计算 三、顺序表在算法中的实…

[WMCTF 2023] crypto

似乎退步不了&#xff0c;这个比赛基本不会了&#xff0c;就作了两个简单题。 SIGNIN 第1个是签到题 from Crypto.Util.number import * from random import randrange from secret import flagdef pr(msg):print(msg)pr(br"""........ …

将eNSP Pro部署在华为云是什么体验

eNSP Pro简介 eNSP Pro 是华为公司数据通信产品线新推出的数通设备模拟器&#xff0c;主要应用在数据通信技能培训&#xff0c;为使用者提供华为数据通信产品设备命令行学习环境。 具备的能力 多产品模拟能力&#xff1a;支持数据通信产品线NE路由器、CE交换机、S交换机、AR…

【源码篇】基于ssm+bootstrap+jquery的学生成绩管理系统

系统介绍 基于ssmbootstrapjquery的学生成绩管理系统一共分为六大模块&#xff0c;分别是用户管理、课程管理、班级管理、学籍管理、学费管理、成绩管理 用户管理&#xff1a; 1、用户信息预览&#xff1a;查询并根据姓名搜索系统用户。 2、新增用户信息&#xff1a;添加系…

css的常见伪元素使用

1.first-line 元素首行设置特殊样式。 效果演示&#xff1a; <div class"top"><p>可以使用 "first-line" 伪元素向文本的首行设置特殊样式。<br> 换行内容 </p></div> .top p::first-line {color: red;} 2.first-lette…

免费内网穿透哪个好?

神卓互联是一种内网穿透技术&#xff0c;可以实现在外部网络访问公司内网的服务。通过建立一个加密的通道&#xff0c;神卓互联可以将内网的动态IP绑定技术&#xff0c;实现远程访问。 使用神卓互联进行内网穿透的步骤如下&#xff1a; 在公司内网中&#xff0c;安装并配置神卓…

【全链路追踪】XXL-JOB添加TraceID

文章目录 一、背景调用路径部署环境问题 二、方案三、Demo示例1、MDC2、RequestInterceptor3、HandlerInterceptor4、logback.xml 四、后续改进思路 一、背景 首先这个项目属于小型项目&#xff0c;由于人手以及时间限制&#xff0c;并未引入Skywalking等中间件来做调用链路追…

数据库厂商智臾科技加入龙蜥社区,打造多样化的数据底座

近日&#xff0c;浙江智臾科技有限公司&#xff08;以下简称“智臾科技”&#xff09;正式签署 CLA 贡献者许可协议&#xff0c;加入龙蜥社区&#xff08;OpenAnolis&#xff09;。 智臾科技主创团队从 2012 年开始投入研发 DolphinDB。DolphinDB 作为一款基于高性能时序数据库…