判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
运行结果:
例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
旋转包括左旋右旋两种情况
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
size_t my_strlen(char *str) //求字符串的长度
{
assert(str != NULL);
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
void Adjust_s(char *str, int k) //右旋字符串
{
assert(str != NULL);
while (k)
{
int j = 0;
int len = my_strlen(str);
char temp = *(str + len - 1); //temp存储最后一个字符
while (*(str +1+ j))
{
*(str +len -1-j) = *(str+len-2-j);
j++;
}
*str = temp;
k--;
}
}
void Adjust_arr(char *str, int k) //左旋字符串
{
assert(str != NULL);
while (k)
{
char temp = *str; // temp储存str第一个字符
int j = 0;
while (*(str + 1 + j)) //abcd左旋需要改变四个字符,三个需要循环改变,判断条件为str+1+j
{
*(str + j) = *(str + 1 + j);
j++;
}
*(str + j) = temp; //把temp赋给最后一个字符
k--;
}
}
int strsame(char *str1, char *str2) //判断两个字符串是否相等
{
assert(str1 != NULL);
assert(str2 != NULL);
int count = 0;
int ret = my_strlen(str1);
while (*str1)
{
if (*str1 == *str2)
{
count++;
str1++;
str2++;
}
else
{
break;
}
}
if (count == ret)
{
return 1;
}
else
{
return 0;
}
}
int Judge_s(char *str1, char *str2) //str2是否是str1的旋转
{
assert(str1 != NULL);
assert(str2 != NULL);
int i = 0;
int adjust = 0;
int len = my_strlen(str1); //my_strlen求字符串的长度
for (i = 1; i < len; i++) //字符串旋转最多有len个不同的结果,比如abcd 左旋结果为:bcda/cdab/dabc/abcd
{
Adjust_arr(str1,i); //左旋字符串str1
int ret = strsame(str2, str1); //判断str2和旋转后的str1是否相同,相同adjust为1,跳出循环,不同为0,继续循环旋转str1
if (ret == 1)
{
adjust = 1;
break;
}
else if (ret == 0)
{
adjust = 0;
}
}
for (i = 0; i < len; i++) //右旋str1
{
Adjust_s(str1, i);
int ret = strsame(str2, str1);
if (ret == 1)
{
adjust = 1;
break;
}
else if (ret == 0)
{
adjust = 0;
}
}
return adjust;
}
int main()
{
char s1[] = "abcde";
char s2[] = "AABBC";
int ret = 0;
ret = Judge_s(s1, s2); //Judge_s判断是否为旋转后的字符串,int返回值进行判断
if (ret == 1)
{
printf("是\n");
}
else if (ret==0)
{
printf("不是\n");
}
system("pause");
return 0;
}
运行结果:
str1"abcde"
str2"AABBC"
str1"abcde"
str2"cdeab" 左旋
str1"abcde"
str2"edabc" 右旋