字符串—左旋右旋

版权声明: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的左/右旋几次的结果。

猜你喜欢

转载自blog.csdn.net/weixin_43214609/article/details/83690602
今日推荐