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