C语言问题---字符串旋转结果(左右旋)

Posted 4nc414g0n

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言问题---字符串旋转结果(左右旋)相关的知识,希望对你有一定的参考价值。

问题:

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定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;
}

以上是关于C语言问题---字符串旋转结果(左右旋)的主要内容,如果未能解决你的问题,请参考以下文章

C++AVL树的实现--详细解析旋转细节

C语言编程 字符串的旋转(左旋右旋及判断)

C++_AVL树插入,查找与修改的实现(Key_Value+平衡因子+三叉链)

在界面生成器中将标签旋转为横向

unity移动圆柱体老是会倒

iOS Objective C - 旋转回纵向后 UIView 无法正确显示