描述
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
1.常规思路:先判断两个字符大小是否相等,若相等,则以字符串str2为参照,旋转str1,每旋转一次判断是否与str2相等,旋转次数由字符串str1长度决定。
#include<stdio.h> #include<string.h> #include<assert.h> int Rotate(char* str1,char* str2) { assert(str1&&str2); int len1 = strlen(str1); int len2 = strlen(str2); if (len1 != len2) return 0; else { while (len1--) { char temp = str1[0]; int i = 0; for (; i < len1; i++) { str1[i] = str1[i + 1]; } str1[i] = temp; if (strcmp(str1, str2) == 0) return 1; } return 0; } } int main() { char str1[] = "ABCDEF"; char str2[] = "DAABC"; int a=Rotate(str1, str2); if(a==1) printf("%s是%s旋转得到的结果",str1,str2); else printf("%s不是%s旋转得到的结果", str1, str2); return 0; }
2.更简单思路:字符串旋转所有的情况都是将字符串拷贝链接后新字符串的字串,只需在新字符串确认是否能查找到字串即可。
#include <stdio.h> #include<string.h> int find(const char* str1, const char* str2) { char* p = strstr(str1, str2); if (p != NULL) return 1; else { return 0; } } int main() { char str1[] = "AABCD"; char ret[9] = {0}; char str2[] = "BCDAA"; strcpy(ret,str1); strcat(ret, str1); int a = find(ret, str2); if (a == 1) { printf("%s是%s的旋转字串\n", str1, str2); } else { printf("%s不是%s的旋转字串\n", str1, str2); } return 0; }