字符串旋转结果(题目分享)

本文介绍了如何通过C语言编写函数,判断一个字符串是否是另一个字符串旋转后得到的。作者通过分析旋转操作的性质,提出通过交换字符实现旋转,并利用strcmp函数进行序列比较。
摘要由CSDN通过智能技术生成

题目描述

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

思路及分析

分析

  • 旋转分为左旋右旋左旋n个字符是将序列左端的前n个字符先单独拿出来,然后将剩下的字符向左平移至左端;右旋n个字符是将序列右端的前n个字符先单独拿出来,然后将剩下的字符向右平移至左端
  • 假设一个字符串为"ABCDE",其左旋n个字符的所有情况为:
    “BCDEA”、“CDEAB”、“DEABC”、“EABCD”、“ABCDE”
    假设一个字符串为"ABCDE",其右旋n个字符的所有情况为:
    “EABCD”、“DEABC”、“CDEAB”、“BCDEA”、“ABCDE”
    我们发现,无论左旋还是右旋n个字符,得到的所有情况是一致的。我们想办法取得每种序列情况,再分别与序列s1比较

问题及解决方案

  • 问题1:怎样取得左旋(或右旋)的所有的序列情况?
    我们想:将第一个元素不断和后面的元素交换,最终第一个元素就会在序列的末尾这就是第一种序列情况"BCDEA"。再重复这样的操作一次我们可以得到"CDEAB",以此类推,我们就能够拿到左旋后的所有的序列情况。

  • 问题2:怎样设计才能让每种序列情况都与序列s1比较?
    回看问题1,我们不断重复同一操作,把它用循环实现,这样我们可以在每次循环后与序列s1比较。关于比较我们使用strcmp函数,需要包含头文件string.h,将两个数组传给strcmp函数,如果两个
    序列相等,就会返回0.

代码实现

#include <stdio.h>
#include <string.h>

int main()
{
//读取字符串,定义各种变量等
	int flag = 0;
	char s1[100] = { 0 };
	char s2[100] = { 0 };
	gets(s1);
	gets(s2);
	
//计算两个序列的长度,便于后面的循环,并进行初步的判断
	int len1 = strlen(s1);
	int len2 = strlen(s2);
	if (len1 != len2)//投机取巧,如果两个序列的长度不一样,那么就没有进行的必要了
	{
		printf("NO!");
	}
	
//实现取得所有旋转后的序列情况,每次while循环后判断
	else
	{
		while (len1--)
		{
			for (int i = 0; i < len2 - 1; i++)
			{
				int temp = s2[i+1];
				s2[i + 1] = s2[i];
				s2[i] = temp;
			}
			if (strcmp(s1, s2) == 0)
			{
				flag = 1;//一旦找到这样一种情况,我们就可以跳出循环,将flag赋值为1,便于对NO的情况进行说明
				break;
			}
		}
	}
	
//结果的展示
	if (flag)
	{
		printf("YES!");
	}
	else
	{
		printf("NO!");
	}
	return 0;
}

后言

我会多多分享稍有难度的题目,培养逻辑思维和代码能力,希望大家共勉。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值