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