字符串旋转题目讲解

题目名称:
字符串左旋
题目内容:
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB

分析思路:

思路一: 首先左旋字符串,不管左旋多少次,左旋多少个字符,都可以看做是左旋第一个字符K次。

每次都实行同样一个步骤:先将第一个字符取出来,把剩余的字符依次往前挪一位,再把取出的第一个字符放到末尾。重复以上步骤K次。如图所示:

思路二:  还是以字符串"ABCDEF"为例,假设左旋2个字符,得到"CDEFAB",那么先逆序"ABCDEF"左边两个字符,"BA", 再逆序"ABCDEF"右边四个字符,"FEDC",最后逆序整个变为"CDEFAB"即为最终结果,这个比较难想,可以封装一个逆序函数,调用三次完成。

思路一代码如下:

void left_spin(char arr[], int k)
{
	int len = strlen(arr);
	while (k--)
	{
		char tmp = arr[0];
		for (int i = 0; i < len - 1; ++i)
		{
			arr[i] = arr[i + 1];
		}
		arr[len - 1] = tmp;
	}
}
int main()
{
	char arr[] = "ABCDEF";
	int k = 0;
	scanf("%d", &k);
	left_spin(arr, k);
	printf("左旋后:%s\n", arr);
	return 0;
}

思路二代码如下:

void reverse(char* left, char* right)
{
	assert(left && right);
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "ABCDEF";
	int len = strlen(arr);
	int k = 0;
	scanf("%d", &k);
	reverse(arr, arr + k-1);
	reverse(arr + k, arr + len - 1);
	reverse(arr, arr + len-1);
	printf("左旋后:%s\n", arr);
	return 0;
}

题目名称:

字符串旋转结果

题目内容:

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 =AABCD和s2 = BCDAA,返回1

给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

思路分析:这题和上一题如出一辙,只是多了判断和右旋。

思路一   借用上题思路一的方法封装函数列出左旋右旋所有情况,再进行判断。

思路二:  假设字符串" ABCDEF"左旋,左旋所有结果列举出来有:

BCDEFA、CDEFAB、DEFABC、EFABCD、FABCDE、ABCDEF

所有可能情况都包含在ABCDEFABCDEF中,也就是说上述6个都是ABCDEFABCDEF的子串。

如此,可以用库函数strncat追加ABCDEF自身,再用strstr找子串,进行判断。

思路一代码如下:

int is_round(char arr1[], char arr2[])
{
	int len1 = strlen(arr1);
	int len2 = strlen(arr2);
	if (len1 != len2)
		return 0;
	for (int i = 0; i < len1; ++i)
	{
		char tmp = arr1[0];
		for (int j = 0; j < len1-1; ++j)
		{
			arr1[j] = arr1[j + 1];
		}
		arr1[len1 - 1] = tmp;
		if (strcmp(arr1, arr2) == 0)
			return 1;
	}
		return 0;
}
int main()
{
	char arr1[] = "ABCDEF";
	char arr2[] = "CDEFAB";
	int ret = is_round(arr1, arr2);
	if (ret == 1)
		printf("YES\n");
	else
		printf("NO\n");
	return 0;
}

思路二代码如下:

int is_round(char arr1[], char arr2[])
{
	int len1 = strlen(arr1);
	int len2 = strlen(arr2);
	if (len1 != len2)
		return 0;
	strncat(arr1, arr1, len1);
	char* ret = strstr(arr1, arr2);
	if (ret == NULL)
		return 0;
	else
		return 1;
}
int main()
{
	char arr1[20] = "ABCDEF";
	char arr2[20] = "CDEFAB";
	int ret = is_round(arr1, arr2);
	if (ret == 1)
		printf("YES\n");
	else
		printf("NO\n");
	return 0;
}

这里注意 arr1 追加自身不能超出自身空间范围。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值