题目描述:
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1
给定s1 = abcd和s2 = ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
思路分析:
思路一:穷举遍历所有需要旋转字符串的所有旋转结果,然后逐一进行比较。
思路二:先给需旋转字符串后追加一个旋转字符串,这样所有的旋转结果都会成为这个字符串的子集,然后判断是否是该字符串的子集即可。
编程逻辑:
首先要判断两个字符串的长度是否一样,如果不一样,那么就一定不可能旋转得到另一个字符串。
一:获取字符串长度决定最大循环次数,然后每旋转一次都和另一个字符串比较一次,直到两个字符串相同,或者循环结束。
二:先使用strncat函数给第一个字符串自追加该字符串,然后再用strstr判断第二字符串是否为第一个字符串追加之后的子集。
代码实现:
int judge_left_move(char arr1[], char arr2[]) { int len = strlen(arr2); int j; for (j = 0; j < len; j ++) { char tmp = arr2[0]; int i; for (i = 0; i < len - 1; i++) { arr2[i] = arr2[i + 1]; } arr2[len - 1] = tmp; if (strcmp(arr1, arr2) == 0) return 1; } return 0; } int main() { char arr1[] = "ABCDE"; char arr2[] = "CDEAB"; int ret; if (strlen(arr1) != strlen(arr2)) { ret = 0; goto end; } ret = judge_left_move(arr1, arr2); end: if (ret) printf("YES"); else printf("NO"); return 0; }
int judge_left_move(char arr1[], char arr2[]) { int len = strlen(arr1); strncat(arr1, arr1, len); char* ret = strstr(arr1, arr2); if (ret == NULL) return 0; else return 1; } int main() { char arr1[] = "ABCDE"; char arr2[] = "CDEAB"; int ret; if (strlen(arr1) != strlen(arr2)) { ret = 0; goto end; } ret = judge_left_move(arr1, arr2); end: if (ret) printf("YES"); else printf("NO"); return 0; }