C语言判断字符旋转

       前言

        今天我们使用c语言来写代码来实现字符串选择的判断,我们来看题目

        题目描述

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

        例如:给定s1 =AABCD和s2 = BCDAA,返回1

                   给定s1=abcd和s2=ACBD,返回0.

        AABCD左旋一个字符得到ABCDA

        AABCD左旋两个字符得到BCDAA

        输入描述

        无

        输出描述

        一行,如果是旋转之后得到的字符串输出YES,不是的话输出NO

        题目分析

        我们想要实现这个过程,首先我们需要搞明白怎么去旋转字符串,之后才可以判断一个字符串是否是另一个字符串旋转的结果。

        首先,我们经过分析发现,当我们将前半部分字符串逆序,将后半部分字符串逆序,之后将整个字符串逆序之后可以得到左旋之后的字符串。

        

        我们了解如何左旋字符串之后就进入判断环节,我们需要判断一个字符串是否是另一个字符串左旋之后的结果。那么我们将这个字符串与原始的字符串依次左旋的结果进行比较。如果相等,那么我们就认为这个字符串是原始字符串左旋之后的结果,输出YES,如果不是输出NO。

        代码展示

        

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
//逆序字符串
void reverse(char* left, char* right)
{
	assert(left);
	assert(right);
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
//左移
void left_move(char arr[], int k)
{
	int len = strlen(arr);
	k %= len;
	reverse(arr, arr + k - 1);
	reverse(arr + k, arr + len - 1);
	reverse(arr, arr + len - 1);
}
//判断是否是左移之后的字符串,是就返回1,不是就返回0
int infer_left_move(char arr1[],char arr2[])
{
	int len1 = strlen(arr1);
	int len2 = strlen(arr2);
	int i = 0;
	//如果两个字符串长度不相同,不用判断,直接返回0
	if (len1 != len2)
	{
		return 0;
	}

	for (i = 0;i < len1;i++)
	{
		left_move(arr1, 1);
		//比较两字符串是否相等,相等就返回1
		if (strcmp(arr1, arr2) == 0)
		{
			return 1;
		}
	}
	//遍历循环字符串中的字符串一遍之后,没有相等就返回0
	return 0;
}
int main()
{
	char arr1[] = "AABCD";
	char arr2[] = "BCDAA";
	int ret = infer_left_move(arr1,arr2);
	if (ret == 1)
	{
		printf("YES\n");
	}
	else
	{
		printf("NO\n");
	}
	return 0;
}

        代码详解

        我们使用函数infer_left_move来进行判断字符串是否是原始字符串左旋得到,在外面判断的过程中,如果两个字符串的长度不相等,直接判断为不是,以为一个字符串无论如何左旋,他的长度是不会改变的,之后我们使用一个for循环来使我们可以与每一次左旋后的字符串进行比较,我们使用strcmp函数来比较每次左旋之后的两个字符串是否相等,如果相等就返回1,输出yes,如果不相等就返回0,输出no.

        在判断的过程中,我们需要每次将字符串左旋1位,我们分装函数left_move来帮我们执行,知道了字符串长度之后,为了防止k超出字符串长度,我们将k%=len,这样我们就算超过也可以正常进行运算。

        我们再分装函数reserve来进行逆序字符串,我们先使用断言语句assert来确保穿参过来的指针left与right有效,之后进行置换。

        在left_move函数中,arr指向的是数组中的第一个元素,我们将他传参给reserve函数中的char*left中表示数组中的第一个字符,之后我们将arr加上想要左移的位数k再减去1传参给reserve函数中的char*right表示数组中前半部分最右侧的字符,之后开始逆序字符串。

        后半部分与全部字符串逆序也是相同的操作。

        之后我们可以得到结果yes

        结果展示

        

        愉快的一天从写代码开始,加油加油!

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

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

相关文章

关于获取邮件授权码

以网易邮箱为例: 第一步:登录之后点击设置 第二步:点击POP3/SMTP/IMAP 第三步:开启SMTP服务 开启哪个都可以 第四步: 扫描二维码开启服务 第五步: 使用手机扫面二维码发送短信 第六步: 得到授权码 将授权码写入配置文件

ADS基础教程10-多态性(动态模型选择)

目录 一、多态性定义二、操作步骤&#xff11;.模型建立&#xff12;.模型选择&#xff13;.执行仿真 一、多态性定义 ADS中支持一个Symbol中&#xff0c;可以同时存在多个子图。在仿真时可以动态选择不同的子图继续宁仿真。 二、操作步骤 &#xff11;.模型建立 在上一章A…

路飞吃桃递归问题

在写代码之前&#xff0c;补充两个知识点 1.C语言递归的模版 2.递归是怎么工作的 好!话不多说让我们开始吧&#xff1a; 我们知道路飞吃了n天&#xff0c;每次都是吃一半&#xff0b;1&#xff0c;知道最后一天&#xff0c;只有一个桃子了&#xff0c;所以就可以列出式子&…

抖音小店个人店和个体店有什么不同?区别问题,新手必须了解!

哈喽~我是电商月月 新手开抖音小店入驻时会发现&#xff0c;选择入驻形式时有三个选择&#xff0c;个人店&#xff0c;个体店和企业店 其中&#xff0c;个人店和个体店只差了一个字&#xff0c;但个人店不需要营业执照&#xff0c;是不是入驻时选择个人店会更好一点呢&#x…

『 Linux 』基础IO/文件IO (万字)

文章目录 &#x1f984; 什么是IO&#x1f984; 文件IO(库级别)&#x1f47e; 文件的打开与关闭&#x1f47e; 当前路径&#x1f47e; 文件的读写 &#x1f984; 标准输入输出流&#x1f984; 文件IO(系统级别)&#x1f47e; 文件的打开&#x1f47e; 文件的关闭&#x1f47e; …

独立开发,做的页面不好看?我总结了一些工具与方法

前言 我有时候会自己开发一些项目,但是不比在公司里面,自己开发项目的时候没有设计稿,所以做出来的页面比较难看。 开发了几个项目之后,我也总结了以下的一些画页面的资源或者方法,希望对大家有帮助~ 颜色&字体 这一部分主要参考的是antd的方案,主要包括颜色与字…

LeetCode算法题:8.字符串转换整数 (atoi)

请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入字符串并丢弃无用的前导空格检查下一个字符&#xff08;假设还未到字符末…

NumPy及Matplotlib基本用法

NumPy及Matplotlib基本用法 导语NumPy导入与生成算术运算N维数组广播元素访问 Matplotlib简单图案绘制多函数绘制图像显示参考文献 导语 深度学习中经常需要对图像和矩阵进行操作&#xff0c;好在python提供了Numpy和Matplotlib库&#xff0c;前者类似一个已经定义的数组类&am…

【负载均衡在线OJ项目日记】编译与日志功能开发

目录 日志功能开发 常见的日志等级 日志功能代码 编译功能开发 创建子进程和程序替换 重定向 编译功能代码 日志功能开发 日志在软件开发和运维中起着至关重要的作用&#xff0c;目前我们不谈运维只谈软件开发&#xff1b;日志最大的作用就是用于故障排查和调试&#x…

国货美妆进入新纪元之际,毛戈平打好“高端牌”了吗?

当前&#xff0c;国内美妆市场的格局已发生较大变化。 一边是国际品牌的“退场”&#xff0c;据统计&#xff0c;2023年退出中国市场的海外美妆品牌有20多个&#xff1b;一边是国内美妆品牌正在迎来自己的时代。 根据魔镜洞察数据&#xff0c;2024年一季度&#xff0c;国货彩…

论文辅助笔记:Tempo之modules/lora.py

1 LoRALayer 基类 2 Linear 2.1 __init__ 2.2 reset_parameter & train 2.3 forward 3 MergeLinear 3.1__init__ enable_lora指定了哪些输出特征使用lora 3.2 reset_parameters & zero_pad & merge_AB 3.3 train & forward

纯血鸿蒙APP实战开发——底部面板嵌套列表滑动案例

介绍 本示例主要介绍了利用panel实现底部面板内嵌套列表&#xff0c;分阶段滑动效果场景。 效果图预览 使用说明 点击底部“展开”&#xff0c;弹出panel面板。在panel半展开时&#xff0c;手指向上滑动panel高度充满页面&#xff0c;手指向下滑动panel隐藏。在panel完全展开…

从零开始的软件测试学习之旅(七)接口测试三要素及案例

接口测试三要素及案例 接口测试介绍接口预定义接口测试的主要作用测试接口流程如下接口测试三要素接口测试分类RESTful架构风格RESTful架构三要素要素一要素二要素三 RESTful架构风格实现案例复习复盘 接口测试介绍 接口介绍 不同主体之间进行通信的通道,它应具有一套规范/标准…

Vulnhub项目:NAPPING: 1.0.1

1、靶机介绍 靶机地址&#xff1a;Napping: 1.0.1 ~ VulnHub 2、渗透过程 老规矩&#xff0c;先探测&#xff0c;靶机ip&#xff1a;192.168.56.152 本机ip&#xff1a;192.168.56.146 来看一看靶机开放哪些端口&#xff0c;nmap一下 nmap -sS -sV -A -T5 192.168.56.152 开…

UE5自动生成地形二:自动生成插件

UE5自动生成地形二&#xff1a;自动生成插件 Polycam使用步骤 本篇主要讲解UE5的一些自动生成地形的插件 Polycam 此插件是通过现实的多角度照片自动建模生成地形数据&#xff0c;也是免费的。这里感谢B站up主古道兮峰的分享 Polycam网站 插件下载地址 插件网盘下载 提取码&a…

6.移除元素

文章目录 题目简介题目解答解法一&#xff1a;双指针代码&#xff1a;复杂度分析&#xff1a; 解法二&#xff1a;双指针优化代码&#xff1a;复杂度分析&#xff1a; 题目链接 大家好&#xff0c;我是晓星航。今天为大家带来的是 相关的讲解&#xff01;&#x1f600; 题目简…

Portforge:一款功能强大的轻量级端口混淆工具

关于Portforge Portforge是一款功能强大的轻量级端口混淆工具&#xff0c;该工具使用Crystal语言开发&#xff0c;可以帮助广大研究人员防止网络映射&#xff0c;这样一来&#xff0c;他人就无法查看到你设备正在运行&#xff08;或没有运行&#xff09;的服务和程序了。简而言…

数据库(MySQL)—— 初识和创建用户

数据库&#xff08;MySQL&#xff09;—— 初识 什么是数据库数据库的种类创建用户mysql -h 主机名或IP地址 -u 用户名 -p 登录mysqlSELECT USER(); 查看当前用户切换用户GRANT ALL PRIVILEGES ON 赋予用户权限 REVOKE 撤销权限示例注意事项 MySQL的图形化界面工具查看所有用户…

ldap对接jenkins

ldap结构 配置 - jenkins进入到 系统管理–>全局安全配置 - 安全域 选择ldap - 配置ldap服务器地址&#xff0c;和配置ldap顶层唯一标识名 配置用户搜索路径 - 配置管理员DN和密码 测试认证是否OK

【xxl-job | 第三篇】SpringBoot整合xxl-job

文章目录 3.SpringBoot整合xxl-job3.1定时任务服务配置3.1.1导入maven依赖3.1.2yml配置3.1.3XxlJobConfig配置类3.1.4定时任务类 3.2xxl-job配置3.2.1新增执行器3.2.2新增任务3.2.3执行任务3.2.4查看日志3.2.5查看任务后台日志 3.3小结 3.SpringBoot整合xxl-job 3.1定时任务服…
最新文章