字符串左旋N个字符

题目

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1.
给定s1 = abcd和s2 = ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
解题思路:右旋一个相当于左旋len-1个,故只要验证字符串是否等于左旋1~len个的结果即可。

最初版本

#include 
#include 

void reverse(char* left,char* right)
{
	while (left < right)
	{
		char temp = *left;
		*left = *right;
		*right = temp;
		left++;
		right--;
	}
}
void left_spin(char* ch,int len,int i)//左旋i个元素  abcdef 左旋2个元素 cdefab 左旋len个元素时第二个reverse因为left>right而不执行
{
	reverse(ch, ch + i - 1);
	reverse(ch + i, ch + len - 1);
	reverse(ch, ch + len - 1);

}
int is_left_spin(char* ch, int len, char* str)
{
	int i = 0;
	for (i = 1; i <= len; i++) //最多可以左旋len个元素
	{
		left_spin(ch, len, 1); //注意此处不是left_spin(ch, len, i),应是left_spin(ch, len, 1)每左移一位,ch就发生了变化
		if (strcmp(ch, str) == 0) return 1;
	}
	return 0;
}
int main()
{
	char ch1[] = "student";
	int len = strlen(ch1);
	char ch2[] = "entstud";
	/*left_spin(ch1, len,4);
	printf("%s", ch1);*/
	if (is_left_spin(ch1, len, ch2))
	{
		printf("YES");
	}
	else
		printf("NO");
	
	return 0;
}

可优化地方
1.len可在函数内部求得,不需要放在main函数
2.可加入assert断言防止出错

优化版本

#include 
#include 
#include 
void reverse(char* left, char* right)
{
	assert(left && left);

	while (left < right)
	{
		char temp = *left;
		*left = *right;
		*right = temp;
		left++;
		right--;
	}
}
void left_spin(char* ch,int i)//左旋i个元素  abcdef 左旋2个元素 cdefab 左旋len个元素时第二个reverse因为left>right而不执行
{
	assert(ch);
	int len = strlen(ch);
	assert(i <= len);

	reverse(ch, ch + i - 1);
	reverse(ch + i, ch + len - 1);
	reverse(ch, ch + len - 1);
}
int is_left_spin(char* ch,char* str)
{
	assert(ch && str);

	int len = strlen(ch);
	int i = 0;
	for (i = 1; i <= len; i++) //最多可以左旋len个元素
	{
		left_spin(ch,1); //注意此处不是left_spin(ch, len, i),应是left_spin(ch, len, 1)每左移一位,ch就发生了变化
		if (strcmp(ch, str) == 0) return 1;
	}
	return 0;
}
int main()
{
	char ch1[] = "student";
	char ch2[] = "ntstude";

	if (is_left_spin(ch1,ch2))
	{
		printf("YES");
	}
	else
		printf("NO");

	return 0;
}

你可能感兴趣的:(算法)