【写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串】

news2025/2/12 20:00:31

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串

1.题目

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC

2.解题思路

这道题当然可以将所有旋转后的结果放到一个数组里,然后进行查找,但是这种做法既不好操作,也太费事
本篇博客主要聊一聊一种较为独特的解法:

其实ABCDE无论怎么旋,旋转后的所有结果,都包含在了ABCDEABCD这个字符串里了。
所以做法很简单,只需要将原字符串再来一遍接在后面,然后找一找待查找的字符串是不是两倍原字符串的子集即可。

3.所用到的库函数:strcpy,strcat,strstr,strncat

3.1库函数strcpy

首先来看看 cplusplus 中这个函数的功能是什么:
在这里插入图片描述

它的作用为:
将一个字符串复制到另一块空间地址中 的函数,‘\0’是停止拷贝的终止条件,同时也会将 ‘\0’ 也复制到目标空间。

说白了,这个函数的作用就是拷贝字符串
其中,第一个参数是拷贝的 “目的地” ,因此不能加上 const ,以保持它的可修改性;
第二个参数则是 “来源” , 需加上 const ,增加代码的鲁棒性和安全性

3.2库函数strcat

首先来看看 cplusplus 中这个函数的功能是什么:
在这里插入图片描述

他的作用是:
将源字符串的副本追加到目标字符串。目标中的结束空字符被源的第一个字符覆盖,并且在由目标中的两个字符串串联形成的新字符串的末尾包含一个空字符。
目的地和来源不得重叠。

说白了就是将多个单独的字符串连接到一起
其中,第一个参数连接的 “目的地” ,因此不能加上 const ,以保持它的可修改性;
第二个参数则是 连接的“来源” , 需加上 const ,增加代码的鲁棒性和安全性

3.3库函数strstr

首先来看看 cplusplus 中这个函数的功能是什么:
在这里插入图片描述

它的作用其实就是:
在字符串str1中查找是否含有字符串str2,如果存在,返回str2在str1中第一次出现的地址;否则返回NULL

不难看出的作用就是:定位字符串

3.4库函数strncat

首先来看看 cplusplus 中这个函数的功能是什么:
在这里插入图片描述

他的作用是:
将源的第一个 num 字符追加到目标,再加上一个终止的 null 字符。
如果源中的 C 字符串的长度小于 num,则只复制到终止 null 字符为止的内容

说白了,他就是按长度连接字符串,连接二的字符串长度需小于数组大小,就是比函数strcat要求多一点
他和strcat的修饰规则一样
其中,第一个参数连接的 “目的地” ,因此不能加上 const ,以保持它的可修改性;
第二个参数则是 连接的“来源” , 需加上 const ,增加代码的鲁棒性和安全性

4解题方法

4.1方法一:使用函数strncat,strstr

4.1.1函数实现

//方法一
size_t is_left_move(char* str1, char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);//判断是否为有效指针

	size_t len1 = strlen(str1);
	size_t len2 = strlen(str2);
	if (len1 != len2)//判断字符串长度,字符串长度不一样,左旋得不到
	{
		return 0;
	}
	strncat(str1, str1, len1);//在str1字符串后面追加一个str1字符串,长度为len1
	char* ret = strstr(str1, str2);//判断追加后的字符串str1里面是否存在str2;
	if (ret != NULL)
		return 1;
	else
		return 0;
}

4.1.2完整代码

#include<stdio.h>
#include<assert.h>
#include<string.h>
//方法一
size_t is_left_move(char* str1, char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);//判断是否为有效指针

	size_t len1 = strlen(str1);
	size_t len2 = strlen(str2);
	if (len1 != len2)//判断字符串长度,字符串长度不一样,左旋得不到
	{
		return 0;
	}
	strncat(str1, str1, len1);//在str1字符串后面追加一个str1字符串,长度为len1
	char* ret = strstr(str1, str2);//判断追加后的字符串str1里面是否存在str2;
	if (ret != NULL)
		return 1;
	else
		return 0;
}
int main()
{
	char str1[30] = "ABCDEF";
	char str2[] = "CDEFAB";
	size_t ret = is_left_move(str1, str2);
	if (ret == 1)
		printf("yes\n");
	else
		printf("no\n");

	return 0;
}

4.1.3运行结果展示

在这里插入图片描述

4.2方法二使用函数strcpy,strcat,strstr

4.2.1函数实现

//方法二:
int is_left_move(char* str1, char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);

	char temp[100] = { '\0' };
	strcpy(temp, str1);//复制一遍字符串str1到数组temp中
	strcat(temp, str1);//再把字符串str1连接到已经复制的temp数组中
	char* ret = strstr(temp, str2);//查找链接完的temp数组中是否有字符串str2
	if (ret != NULL)
		return 1;
	else
		return 0;
}

4.2.2完整代码

#include<stdio.h>
#include<assert.h>
#include<string.h>
//方法二:
int is_left_move(char* str1, char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);

	char temp[100] = { '\0' };
	strcpy(temp, str1);//复制一遍字符串str1到数组temp中
	strcat(temp, str1);//再把字符串str1连接到已经复制的temp数组中
	char* ret = strstr(temp, str2);//查找链接完的temp数组中是否有字符串str2
	if (ret != NULL)
		return 1;
	else
		return 0;
}
int main()
{
	char str1[30] = "ABCDEF";
	char str2[] = "CDEFAB";
    int ret = is_left_move(str1,str2);
	if (ret == 1)
		printf("yes\n");
	else
		printf("no\n");

	return 0;
}

4.2.3运行结果展示

在这里插入图片描述

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

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

相关文章

40 proc 文件系统

前言 在 linux 中常见的文件系统 有很多, 如下 基于磁盘的文件系统, ext2, ext3, ext4, xfs, btrfs, jfs, ntfs 内存文件系统, procfs, sysfs, tmpfs, squashfs, debugfs 闪存文件系统, ubifs, jffs2, yaffs 文件系统这一套体系在 linux 有一层 vfs 抽象, 用户程序不用…

为何不禁用危险的memcpy或更新memcpy源码,而使用更安全的memcpy_s

关于使用更安全的memcpy_s而不禁用危险的memcpy或更新memcpy源码的问题&#xff0c;以下是一些考虑因素&#xff1a;首先&#xff0c;memcpy_s并不是绝对安全的实现。尽管它要求您提供一个长度参数来确保不会发生溢出或越界问题&#xff0c;但这个长度仍然需要您自己提供&#…

液压系统比例阀放大器US-DAT2-F、US-DAPQ-N、US-DAS2

比例放大器US-DAS1、US-DAS2、US-DAPQ-N、US-DAPQ-H、US-P1、US-P2、US-DAT2-F、US-DAT2-A适配控制各种不带位置反馈比例阀&#xff1b; 控制如博世力士乐&#xff08;Bosch Rexroth&#xff09;、伊顿威格士&#xff08;EATON Vickers&#xff09;、油研&#xff08;YUKEN&am…

从小白到大神之路之学习运维第78天-------Kubernetes集群应用部署测试

第四阶段 时 间&#xff1a;2023年8月11日 参加人&#xff1a;全班人员 内 容&#xff1a; Kubernetes集群应用部署测试 目录 应用部署测试 应用部署测试 下面我们部署一个简单的Nginx WEB服务&#xff0c;该容器运行时会监听80端口。 &#xff08;一&#xff09;环境…

vue报错‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

运行我的后台管理项目的时候报错&#xff1a;‘vue-cli-service’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 查看自己package.json中是否有vue 或者vue-cli-service 查看自己项目目录下有没有node_module文件夹&#xff0c;如果有删除&#xff0c;然后…

uprobe trace多线程mutex等待耗时

问题背景环境 ubuntu2204 服务器支持debugfs uprobe&#xff0c;为了提升应用程序的性能&#xff0c;需要量化不同参数下多线程主程序等待在mutex上的耗时区别 linux document中对uprobe events的说明如下 uprobetracer.rst - Documentation/trace/uprobetracer.rst - Linux…

什么是分布式系统,如何学习分布式系统

正文 虽然本人在前面也写过好几篇分布式系统相关的文章&#xff0c;主要包CAP理论&#xff0c;分布式储存与分布式事务&#xff0c;但对于分布式系统&#xff0c;并没有一个跟清晰的概念。分布式系统涉及到很多的技术、理论与协议&#xff0c;很多人也说&#xff0c;分布式系统…

股票自动交易接口开发原理及源码分享

股票自动交易接口的开发原理涉及多个方面&#xff0c;主要包括以下几个步骤&#xff1a; 1. 数据接口获取&#xff1a;通过连接到证券交易所或第三方数据提供商的API&#xff0c;获取实时市场数据&#xff0c;包括股票报价、交易成交量、买卖盘口等信息。 2. 策略定义&#x…

分类预测 | MATLAB实现SMA-CNN-BiLSTM-Attention多输入分类预测

分类预测 | MATLAB实现SMA-CNN-BiLSTM-Attention多输入分类预测 目录 分类预测 | MATLAB实现SMA-CNN-BiLSTM-Attention多输入分类预测分类效果基本介绍模型描述程序设计参考资料 分类效果 基本介绍 1.MATLAB实现SMA-CNN-BiLSTM-Attention多输入分类预测&#xff0c;CNN-BiLSTM结…

数据结构篇七:排序

文章目录 前言1.插入排序1.1 基本思想1.2 代码实现1.3 特性总结 2.希尔排序2.1 基本思想2.2 代码实现2.3 特性总结 3. 选择排序3.1 基本思想3.2 代码实现3.3 特性总结 4. 堆排序4.1 基本思想4.2 代码实现4.3 特性总结 5. 冒泡排序5.1 基本思想5.2 代码实现5.3 特性总结 6. 快速…

数据库SQL查询语句的执行顺序是怎么样的?

目录 1. 引言 2. SQL查询语句举例 3. SQL查询语句顺序执行误区 4. 查询语句步骤分析 5. SQL查询语句执行顺序总结 6. 面试小问题 6.1 WHERE 和 HAVING 谁的过滤范围更广&#xff1f; 6.2 为什么 WHERE 之后不能使用聚合函数进行过滤&#xff1f; 6.3 为什么 WHERE 的执…

一文了解SmartSE

你或许没有听说过SmartSE&#xff0c;但你一定听说过“Virtual Electronic”&#xff0c;也就是“V-ECU”&#xff0c;虚拟ECU。2020年&#xff0c;ProSTEP iViP协会的SmartSE项目组出版了白皮书&#xff0c;对虚拟ECU做了详尽介绍。 ProSTEP iViP协会成立于1993年&#xff0c…

远程预付费平台助力转供电主体解决“收费难” 安科瑞 顾语欢

为了帮助物业合理收取转供电电费以及过程中的运营成本&#xff0c;安科瑞AcrelCloud-3200远程预付费平台解决方案根据分时电价政策配置合理的计费仪表和软件&#xff0c;帮助转供电主体完成电费统计、电网损耗、租户公共用电公摊&#xff0c;协助转供电主体更高效的解决电费收取…

Navicat 针对金融用户的投票调查 | 诚邀您的参与,让 Navicat 更优!

Navicat 是一款流行的数据库管理工具&#xff0c;它可以帮助用户更轻松地管理和维护数据库。一直以来&#xff0c;Navicat 在金融业&#xff08;银行、保险、证券和互联网金融服务业等&#xff09;得到广泛应用。目前&#xff0c;浦发银行、邮储银行、农业银行、中国银联和泰康…

Arcgis地图实战二:地图实时轨迹展示

1.最终效果预览 2.定时器执行方法 进入页面执行执行器 this.locationInterval setInterval(() > {this.getCurrentPosition();}, this.conf.LocateInterval);离开页面销毁 clearInterval(this.locationInterval);this.conf.LocateInterval为获取的数据同步中的定时器间隔…

UE4/5 GAS技能系统入门3 - GameplayEffect

阅读本文需要上一篇AttributeSet的基础知识&#xff1a; https://blog.csdn.net/grayrail/article/details/132148492 本文也并非教程性质文章&#xff0c;主要讲解学习记录为主。 这篇开始讲AttributeSet配置好后&#xff0c;GameplayEffect的使用。 1.将GE配置至Ability Co…

计算机竞赛 - 基于机器视觉的图像拼接算法

前言 图像拼接在实际的应用场景很广&#xff0c;比如无人机航拍&#xff0c;遥感图像等等&#xff0c;图像拼接是进一步做图像理解基础步骤&#xff0c;拼接效果的好坏直接影响接下来的工作&#xff0c;所以一个好的图像拼接算法非常重要。 再举一个身边的例子吧&#xff0c;…

远程RDP、远控手机、双屏控双屏,向日葵“瓜子会员”妥妥的真香

最近儿有点“小感冒”&#xff0c;没去公司在家歇着&#xff0c;居家归居家&#xff0c;砖还是要搬的&#xff0c;突然来活了也得及时的处理掉&#xff0c;这种时候我一般用远程桌面的方式&#xff0c;之前就一直用的向日葵远程控制。 为啥用远程桌面呢&#xff1f;主要原因是家…

31 | 独角兽企业数据分析

独角兽企业:是投资行业尤其是风险投资业的术语,一般指成立时间不超过10年、估值超过10亿美元的未上市创业公司。 项目目的: 1.通过对独角兽企业进行全面地分析(地域,投资方,年份,行业等),便于做商业上的战略决策 项目数据源介绍 1.数据源:本项目采用的数据源是近…

独立站还值不值得入?先来了解最新趋势!

近年来&#xff0c;随着跨境电商行业的蓬勃发展&#xff0c;跨境卖家的数量持续攀升&#xff0c;然而由于亚马逊等跨境电商平台对第三方卖家的规则约束越加严厉&#xff0c;目前有很多卖家都在考虑平台转型独立站。与此同时&#xff0c;独立站 SHEIN、Anker、DX 的成功&#xf…