版权声明:Zhining https://blog.csdn.net/weixin_43214609/article/details/83690602
函数功能:
- 输出字符串左旋右旋K次的结果,这里就只输出左旋。
- 输入两个字符串str1、str2判断str2是不是str1的旋转后的字符串
左旋:
revolve左旋1次是evolver ;左旋2次是volvere;右旋即相反旋转;
思路:
左旋的实质:就是把字符串第一位(0)的字符放到最后一位(len-1),再依次向前移动一位,循环K次即可。
比较两个字符串,就是把str2和str1的每次左旋结果和每次的右旋结果作比较,如果strcmp的结果是0,那么就证明匹配,即str2是str1的旋转结果。
方法:
1.使用嵌套循环
2.使用递归(不适合K很大的时候,递归每调用函数就会开辟内存空间。)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
char* left_revolve(char str[], int k)
{
int i = 0, j = 0;
int len = strlen(str);
k %= len; //左旋len还是原来的字符串
for (i = 1; i <= k; i++)
{
char Tmp = str[0];
for (j = 0; j <= len - 1; j++)
{
str[j] = str[j + 1];
}
str[len - 1] = Tmp;
}
return str;
}
int is_revolve(char str1[], char str2[])
{
int len = strlen(str1);
while (strlen(str1) == strlen(str2) )
{
for (int i = 0; i < len; i++) //左旋
{
if (strcmp(str1, str2) == 0)
{
return 1;
}
char Tmp = str1[0];
for (int j = 0; j < len - 1; j++)
{
str1[j] = str1[j + 1];
}
str1[len - 1] = Tmp;
}
for (int i = 0; i < len;i++) //右旋
{
if (strcmp(str1, str2) == 0)
{
return 1;
}
char Tmp = str1[len - 1];
for (int j = 0; j < len - 1; j++)
{
str1[j + 1] = str1[j];
}
str1[0] = Tmp;
}
return 0;
}
}
int main()
{
char str[10] = { 0 };
char str1[10] = { 0 };
char str2[10] = { 0 };
int k = 0;
printf("输入原字符:\n");
gets(str);
printf("左旋几次?\n");
scanf("%d", &k);
printf("旋转之后:%s\n", left_revolve(str, k));
printf("输入字符串str1:\n");
gets(str1);
printf("输入字符串str2:\n");
gets(str2);
int ret = is_revolve(str1, str2);
if (ret == 1)
{
printf("str2 %s 是 str1 %s 的旋转后的字符串\n", str2, str1);
}
else
{
printf("str2 %s 不是 str1 %s 的旋转后的字符串\n", str2, str1);
}
system("pause");
return 0;
}
结果:
可以添加不同返回值或者输出语句,输出str2是str1的左/右旋几次的结果。