字符串旋转结果(左右旋)(三步反转法)

问题:

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC

利用库函数(判断 最简方法)

两倍str1,判断str2是否为str1的字串

strcat与strncat:

  1. 由于strcat本质上是把被增长的字符串的’\0’与增长字符串的元素交换实现的,那么当增长的是本身的时候,’\0’会和前面的元素交换,当所有交换完毕以后会发现’\0’又跑到后面去了,这样终止条件便再也不成立,会陷入到死循环当中;strcat()方便之处在于只用传两个参数能够实现,比较简便
  2. 建议采用strncat(),由于不会出现上述的陷入死循环的可能,顶可能是多算一步长度(strlen(数组名)),而且strncat()有一个不可或缺的优点,是可以自由的控制要增长的字符

strstr:

  1. C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 ‘\0’。
int is_string_rotate(char* str1, char* str2)
{
	//长度不相等,肯定不是旋转得到的
	//AABCDAABCD 
	//BCD
	if (strlen(str1) != strlen(str2))
	{
		return 0;
	}

	//1. str1字符串的后边追加一个str1
	//AABCDAABCD
	int len = strlen(str1);
	strncat(str1, str1, len);
	//2. 判断str2是否为str1的字串
	char* ret = strstr(str1, str2);

	

	if (ret == NULL)
	{
		return 0;
	}
	else
	{
		return 1;
	}
	//简写 return ret != NULL;
}
int main()
{
	char arr1[20] = "AABCD";
	char arr2[] = "BCDAA";
	int ret = is_string_rotate(arr1, arr2);
	if (ret == 1)
	{
		printf("yes\n");
	}
	else
	{
		printf("no\n");
	}
	return 0;
}

三步反转法(左旋)

#include <assert.h>
//三步反转法
void reverse(char* left, char* right)
{
	assert(left);
	assert(right);
	while (left<right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}

void string_left_rotate(char* str, int k)
{
	assert(str);

	int n = strlen(str);
	reverse(str, str+k-1);//左
	reverse(str+k, str+n-1);//右
	reverse(str, str+n-1);//整体
}


int main()
{
	char arr[10] = "ABCDEF";
	int k = 4;
	string_left_rotate(arr, k);
	printf("%s\n", arr);

	return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值