字符串旋转结果

news2024/11/20 22:42:37

文章目录

    • 题目
    • 解法1
    • 解法2


题目

字符串旋转结果

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

解法1

1.我们再创建两个函数,分别用于左旋和右旋。
2.然后再每旋转一次就和另一个数组比较,当比较完n次后再转一次再比较,这时我们设置一个标志变量来判断最终这两个数组的元素是否都先相等,要是相等直接返回 1 ,要是走完了旋转都没有相等的就返回 0

代码:

void zuoxuan(char * s, int n) {//左旋函数
	char te = *s;//将首元素先给   te 
	for (int i = 0; i < n - 1; i++)//数组整体向左移动
		*(s + i) = *(s + i + 1);
	*(s + n - 1) = te;//移动动完之后再将te放到数组的最后个位置>>这样就完成了一次左移
}
void youxuan(char* s, int n) {//右旋函数
	char te = *(s + n - 1);//将最后一个元素先给   te 
	for (int i = n - 1; i > 0; i--) {//数组整体先右移动
		*(s + i) = *(s + i-1);
	}
	*s = te;//移动完再将te放到数组的第一个位置>>完成右移
}
int zhu(char* s, char* s1, int n) {
	for (int i = 0; i < n-1; i++) {//先进行n-1次的左旋,(使数组从头到尾转一次)
		int t = 0;//标志变量,当t=n是就是两个数组相等
		zuoxuan(s1, n);//调用左旋函数
		for (int j = 0; j < n; j++) {//对两个数组遍历对比
			if (*(s + j) == *(s1 + j))
				t++;
		}
		if (t == n)//判断这次旋转后是否相等,相等返回1
			return 1;
	}
	for (int i = 0; i < n-1; i++) {// 先进行n - 1次的右旋,(使数组从头到尾转一次)
		int t = 0;//标志变量,当t=n是就是两个数组相等
		youxuan(s1, n);//调用右旋函数
		for (int j = 0; j < n; j++) {//对两个数组遍历对比
			if (*(s + j) == *(s1 + j))
				t++;
		}
		if (t == n)//判断这次旋转后是否相等,相等返回1
			return 1;
	}
	return 0;//要是都不相等就返回0
}
int main() {
	char arr[] = "abcd";
	char arr1[] = "ACBD";
	int n = strlen(arr);//求数组长度
	int i = zhu(arr, arr1, n);//调用
	printf("%d\n", i);//打印
	return 0;
}

这种解法非常暴力,时间复杂度为O(n*n),空间复杂度O(1)

解法2

这种解法相对简洁

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

在写代码之前先介绍一下三个库函数
1.strcpy
在这里插入图片描述
例:

int main() {
	char arr[128] = "qwe";
	char arr1[128];
	strcpy(arr1, arr);
	printf("%s", arr1);
	return 0;
}

运行结果:
在这里插入图片描述
2.strcar
在这里插入图片描述
例:

int main() {
	char arr[128] = "qwe";
	char arr1[128]="rty";
	strcat(arr, arr1);
	printf("%s", arr);
	return 0;
}

运行结果
在这里插入图片描述
3.strstr

strstr()函数是一个参数为两个字符指针类型,返回值是char*类型的函数。

用于找到子串(str2)在一个字符串(str1)中第一次出现的位置(不包括str2的串结束符),并返回该位置的指针,如果找不到,返回空指针(NULL)。

这里因为传进来的地址指向的内容不会在发生改变,所以我们在两个形参(char*)前加上const。
它包含在string.h头文件中。

char* strstr(const char* str1,const char* str2)

例:

int main() {
	char arr[128] = "qwe";
	char arr1[128]="rtytrqwew";
	char * s=strstr(arr1, arr);
	printf("%s",s);
	return 0;
}

运行结果
在这里插入图片描述

最后就是这道题的实现了

代码:

int findRound(const char* src, char* find)
{
	char tmp[256] = { 0 }; //用一个辅助空间将原字符串做成两倍原字符串
	strcpy(tmp, src); //先拷贝一遍
	strcat(tmp, src); //再连接一遍AABCDAABCD
	return strstr(tmp, find) != NULL; //看看找不找得到//真返回 1 ,假返回 0 
}
int main() {
	char arr[] = "AABCD";
	char arr1[] = "BCDAA";
	int n = strlen(arr);//求数组长度
	int i = findRound(arr,arr1);//调用
	printf("%d\n", i);//打印
	return 0;
}

时间复杂度为O(1),空间复杂度为O(n)

今天的分享就到这了,谢谢大家的观看

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

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

相关文章

人工智能基础_机器学习033_多项式回归升维_多项式回归代码实现_非线性数据预测_升维后的数据对非线性数据预测---人工智能工作笔记0073

然后我们来实际的操作一下看看,多项式升维的作用,其实就是为了,来对,非线性的数据进行拟合. 我们直接看代码 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression X=np.linspace(-1,11,num=100) 从-1到11中获取100个数…

No203.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

fileread任意文件读取学习笔记

任意文件读取概述 一些网站的需求&#xff0c;可能会提供文件查看与下载的功能。如果对用户查看或下载的文件没有限制或者限制绕过&#xff0c;就可以查看或下载任意文件。这些文件可以是源代码文件&#xff0c;配置文件&#xff0c;敏感文件等等。 任意文件读取会造成&#x…

深入理解JVM虚拟机第二十五篇:详解JVM方法的绑定机制静态绑定和动态绑定,早期绑定晚期绑定,并编写代码从字节码角度证明这件事情

大神链接&#xff1a;作者有幸结识技术大神孙哥为好友&#xff0c;获益匪浅。现在把孙哥视频分享给大家。 孙哥链接&#xff1a;孙哥个人主页 作者简介&#xff1a;一个颜值99分&#xff0c;只比孙哥差一点的程序员 本专栏简介&#xff1a;话不多说&#xff0c;让我们一起干翻J…

电脑屏幕标记软件——Pointofix

前言 Pointofix是一款由德国人开发的屏幕标记软件&#xff0c;德国人的工匠精神&#xff0c;是出了名的&#xff0c;德国人开发的软件也一样。 Pointofix体积非常小巧&#xff0c;安装包只有1MB大小&#xff0c;使用Pointofix可以直接在屏幕上面写字、画图、标重点。 下面介…

基于单片机的电源切换控制器设计(论文+源码)

1.系统设计 在基于单片机的电源切换控制器设计中&#xff0c;系统功能设计如下&#xff1a; &#xff08;1&#xff09;实现电源的电压检测&#xff1b; &#xff08;2&#xff09;如果电压太高&#xff0c;通过蜂鸣器进行报警提示&#xff0c;继电器进行切换&#xff0c;使…

【Java 进阶篇】JQuery DOM操作:CRUD操作的前端魔法

在前端开发的舞台上&#xff0c;CRUD&#xff08;Create, Read, Update, Delete&#xff09;操作是一种极为重要的技能&#xff0c;它涉及对页面元素的增删改查。而JQuery&#xff0c;这位前端开发的魔法师&#xff0c;为我们提供了便捷而强大的方法&#xff0c;使得CRUD操作变…

Winform / WPF 自定义控件 —— IPV4 地址输入框

在开始阅读本文之前&#xff0c;如果您有学习创建自定义控件库并在其他项目中引用的需求&#xff0c;请参考&#xff1a;在Visual Studio中创建自定义Winform控件库并在其他解决方案中引用https://blog.csdn.net/YMGogre/article/details/126508042 0、引言 Winform / WPF 框架…

视频推拉流EasyDSS直播点播平台获取指定时间快照的实现方法

视频推拉流直播点播系统EasyDSS平台&#xff0c;可提供流畅的视频直播、点播、视频推拉流、转码、管理、分发、录像、检索、时移回看等功能&#xff0c;可兼容多操作系统&#xff0c;在直播点播领域具有广泛的场景应用。为了便于用户集成、调用与二次开发。 今天我们来介绍下在…

Telnet 测试 UDP 端口?

Telnet 并不支持 UDP 端口的测试&#xff0c;可以使用 nc 命令来进行测试。nc 命令两种都支持&#xff1a; TCP # nc -z -v -u [hostname/IP address] [port number] # nc -z -v 192.168.10.12 22 Connection to 192.118.20.95 22 port [tcp/ssh] succeeded! UDP # nc -z -v…

算法通关村第十六关青铜挑战——原来滑动窗口如此简单!

大家好&#xff0c;我是怒码少年小码。 从本篇开始&#xff0c;我们就要开始算法的新篇章了——四大思想&#xff1a;滑动窗口、贪心、回溯、动态规划。现在&#xff0c;向我们迎面走来的是——滑动窗口思想&#xff01;&#x1f61d; 滑动窗口思想 概念 在数组双指针里&am…

Python机器学习、深度学习提升气象、海洋、水文领域实践应用

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库&#xff0c;还有丰富的第三方库&#xff0c;Python在数据处理、科学计算、数学建模、数据挖…

Live800:金牌客服常用的6大提问技巧

在客服行业&#xff0c;提问技巧是非常重要的一项技能。好的提问技巧不仅能够帮助客服人员更好地了解客户需求&#xff0c;还能够提高客户满意度和忠诚度。以下是金牌客服常用的6大提问技巧&#xff0c;希望能够对客服人员提升工作效率有所帮助。 1、开放性问题 开放性问题是指…

实现线程的多种方式锁的介绍ThreadLocal线程池 详细总结(上)

1、介绍 1. 线程回顾 2. 各种所的认识 3. JUC 并发库 4. ThreadLocal 5. 线程池 2、线程回顾 进程&#xff1a; 进程是资源&#xff08; CPU 、内存等&#xff09;分配的基本单位&#xff0c;它是程序执行时的一个实例。程序运行时系 统就会创建一个进程&#xff0c;并为…

图论17-有向图的强联通分量-Kosaraju算法

文章目录 1 概念2 Kosaraju算法2.1 在图类中设计反图2.2 强连通分量的判断和普通联通分量的区别2.3 代码实现 1 概念 2 Kosaraju算法 对原图的反图进行DFS的后序遍历。 2.1 在图类中设计反图 // 重写图的构造函数public Graph(TreeSet<Integer>[] adj, boolean dire…

JVM虚拟机:垃圾回收器之G1

本文重点 在前面的课程中我们介绍了六个垃圾回收器,分别是新生代的三个以及老年代的三个,本文我们将介绍一个垃圾回收器,它既可以用于新生代又可以用于老年代,这个垃圾回收器就是G1。 G1垃圾回收器的特点 G1是一种服务器端的并发收集垃圾回收器,应用在多处理器和大容量…

Zookeeper 命令使用和数据说明

文章目录 一、概述二、命令使用2.1 登录 ZooKeeper2.2 ls 命令&#xff0c;查看目录树&#xff08;节点&#xff09;2.3 create 命令&#xff0c;创建节点2.4 delete 命令&#xff0c;删除节点2.5 set 命令&#xff0c;设置节点数据2.6 get 命令&#xff0c;获取节点数据 三、数…

PBHA(page based hardware attributes)的介绍

基本介绍 基于页面的硬件属性 (PBHA&#xff1a;page based hardware attributes) 是一项可选的、由实现定义的功能。 它允许软件在转换表中设置最多四位&#xff0c;然后通过事务通过内存系统传播这些位&#xff0c;并可在系统中用于控制系统组件。这些位的含义特定于系统设计…

论文浅尝 | 用于开放式文本生成的事实增强语言模型

笔记整理&#xff1a;李煜&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://proceedings.neurips.cc/paper_files/paper/2022/hash/df438caa36714f69277daa92d608dd63-Abstract-Conference.html 1. 动机 生成式语言模型&#xff08;例如 GPT-3…

本田发布全新CB1000 Hornet,是杜卡迪街霸劈了腿还是Z1000红杏出墙?

米兰车展上&#xff0c;本田带来了全新的大黄蜂CB1000 Hornet&#xff0c;外观方面抛弃了之前的本田推出的Neo Sports Caf风格&#xff0c;新款的外观看起来要更加战斗一点。不过新的这个前脸改的&#xff0c;我只能说是杜卡迪街霸劈了腿还是Z1000红杏出墙&#xff1f;外观方面…