题目描述
- 写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:
给定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;
}
后言
我会多多分享稍有难度的题目,培养逻辑思维和代码能力,希望大家共勉。