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

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

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运行结果展示

在这里插入图片描述

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

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

相关文章

当前服务器版本不支持该功能,请联系经销商升级服务器 - - 达梦数据库报错

当前服务器版本不支持该功能&#xff0c;请联系经销商升级服务器 - - 达梦数据库报错 环境介绍1 搭建测试环境2 报错内容3 标准版介绍 环境介绍 某项目使用标准版数据库中&#xff0c;使用insert into 正常操作表&#xff0c;插入数据时报错&#xff0c;表为普通表。 1 搭建测…

sharedPreferences的使用之按钮状态切换的保存

什么是sharedPreferences&#xff1f;有什么用 SharedPreference是Android开发中一个轻量级的数据存储的方式&#xff0c;除了它还有SQLite数据库。它可以将数据以键值对的形式存放到文件中&#xff0c;在需要的时候再取出来使用。相比于去操作数据库&#xff0c;对于一些简单…

3.1 Spring MVC概述

1. MVC概念 MVC是一种编程思想&#xff0c;它将应用分为模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;、控制器&#xff08;Controller&#xff09;三个层次&#xff0c;这三部分以最低的耦合进行协同工作&#xff0c;从而提高应用的可扩展性及可维护…

基于Flask的模型部署

基于Flask的模型部署 一、背景 Flask&#xff1a;一个使用Python编写的轻量级Web应用程序框架&#xff1b; 首先需要明确模型部署的两种方式&#xff1a;在线和离线&#xff1b; 在线&#xff1a;就是将模型部署到类似于服务器上&#xff0c;调用需要通过网络传输数据&…

大模型的数据隐私问题有解了,浙江大学提出联邦大语言模型

作者 | 小戏、Python 理想化的 Learning 的理论方法作用于现实世界总会面临着诸多挑战&#xff0c;从模型部署到模型压缩&#xff0c;从数据的可获取性到数据的隐私问题。而面对着公共领域数据的稀缺性以及私有领域的数据隐私问题&#xff0c;联邦学习&#xff08;Federated Le…

AI:02-基于深度学习的动物图像检索算法的研究

文章目录 一、算法原理二、代码实现三、实验结果四、总结深度学习在计算机视觉领域中的应用越来越广泛,其中动物图像检索算法是一个重要的应用场景。本文将介绍一种基于深度学习的动物图像检索算法,并提供相应的代码实现。 一、算法原理 本算法采用卷积神经网络(Convolutio…

如何将maven部署在Idea的教学,和idea介绍

目录 一.idea介绍&#xff0c;以及一些基本特点&#xff01; 1.1idea介绍 1.2idea特点 1.3.idea和eclipse区别 1.4idea安装 4.1下载网址 4.2下载后安装&#xff08;见图片&#xff09; 1.5 Idea的一些操作更改 5.1主题颜色 5.2设置鼠标悬浮提示 5.3显示方法分隔符 5.4忽…

架构设计第八讲:架构 - 理解架构的模式2 (重点)

架构设计第八讲&#xff1a;架构 - 理解架构的模式2 (重点) 本文是架构设计第8讲&#xff1a;架构 - 理解架构的模式2&#xff0c;整理自朱晔的互联网架构实践心得, 他是结合了 微软给出的云架构的一些模式的基础上加入他自己的理解来总结互联网架构中具体的一些模式。我在此基…

Databend 开源周报第 105 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 Databend 轻量级…

netty面试题2

1、一次完整的HTTP请求的所经历的步骤 1、首先进行DNS域名解析&#xff08;本地浏览器缓存、操作系统缓存或者DNS服务器&#xff09;&#xff0c;首先会搜索浏览器自身的DNS缓存&#xff08;缓存时间比较短&#xff0c;大概只有1分钟&#xff0c;且只能容纳1000条缓存&#xff…

C语言案例 分数列求和-11

题目&#xff1a;有一分数列&#xff1a;2 / 1,3 / 2,5 / 3,8 / 5,13 / 8,21 / 13 …求出这个数列的前20项之和。 程序分析 这是一个典型的分数列数学逻辑题&#xff0c;考究这类题目是需要从已知的条件中找到它们的分布规律 我们把前6荐的分子与分母分别排列出来&#xff0c;…

知识图谱实战应用23-【知识图谱的高级用法】Neo4j图算法的Cypher查询语句实例

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用23-【知识图谱的高级用法】Neo4j图算法的Cypher查询语句实例,Neo4j图算法是一套在Neo4j图数据库上运行的算法集合。这些算法专门针对图数据结构进行设计,用于分析、查询和处理图数据。图算法可以帮助我们发现图中的模…

Anaconda Prompt使用pip安装PyQt5-tools后无法打开Spyder或闪退

艹&#xff01;MLGBZD! 真TMD折腾人&#xff01; 出现原因&#xff1a; 首次安装完Anaconda3-2023.07-1-Windows-x86_64.exe后首次打开Spyder&#xff0c;此时是没有问题的&#xff0c;然后打开Anaconda Prompt&#xff0c;查看有哪些包&#xff0c;pip list 这时候开始首次安…

C语言学习笔记 使用vscode外部console出现闪退-12

前言 在使用vscode的外部console时&#xff0c;会出现闪退现象&#xff0c;这是因为程序运行结束后&#xff0c;系统自动退出了终端&#xff08;终端机制决定的&#xff09;。我们可以在C程序结束后&#xff0c;使用system函数来暂停DOS终端系统&#xff0c;这样就可以完整地看…

6-Ngnix配置反向代理

1.前提 虚拟机能连接外网 仿真http应用需在本虚拟机启用(原因&#xff1a;只有一台虚拟机做测试) http_8080和http_8081要启用&#xff08;http测试应用&#xff09; [rootcent79-2 ~]# ls -l http_* -rwxr-xr-x 1 root root 6391676 Jul 19 13:39 http_8080 -rwxr-xr-x 1 …

监控Kubernetes 控制面组件的关键指标

控制面组件的监控&#xff0c;包括 APIServer、Controller-manager&#xff08;简称 CM&#xff09;、Scheduler、etcd 四个组件。 1、APIServer APIServer 的核心职能是 Kubernetes 集群的 API 总入口&#xff0c;Kube-Proxy、Kubelet、Controller-Manager、Scheduler 等都需…

系列六、Redis中的五大数据类型及相关操作

一、五大数据类型 String类型、List类型、Set类型、ZSet类型、hash类型。 二、String类型 2.1、内存储存模型 2.2、常用操作命令 三、List类型 3.1、概述 list列表&#xff0c;相当于Java中的list集合。特点&#xff1a;元素有序 且 可以重复。 3.2、内存存储模型 3.3、常用…

MySQL——Mysql安装教程- Windows

一、Mysql安装 1、下载mysql安装包 下载链接&#xff1a; 链接&#xff1a; https://pan.baidu.com/s/1rFpMqOCApiQQEwYSs9XSmg https://pan.baidu.com/s/1rFpMqOCApiQQEwYSs9XSmg 提取码&#xff1a;zt88 2、 安装 1&#xff09;选择电脑磁盘空闲的路径&#xff1a; 2&…

springboot+mybatis+mybatis-plus对crud项目进行改进

springbootmybatis实现简单的增、删、查、改https://blog.csdn.net/heyl163_/article/details/132197201上一篇文章&#xff0c;已经详细地介绍了怎么通过springboot项目整合mybatis实现简单的数据库表的增删改查功能&#xff0c;是最简单的springboot项目的结构。所以有很多问…

UDP服务器—实现数据通信

目录 前言 1.接口介绍 2.编写服务器 3.编写客户端 4.测试 总结 前言 在这篇文章中为大家介绍如何通过编码实现数据通信&#xff0c;实现思路是根据前面介绍的网络编程函数编写一个服务端和客户端&#xff0c;实现客户端和服务端双方通信 1.接口介绍 创建套接字 #include…