写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1=AABCD和s2=BCDAA,返回1
给定s1=abcd和s2=ACBD返回0
AABCD左旋转一个字符得到ABCDA
AABCD左旋转二个字符得到BCDAA
AABCD右旋转一个字符得到DAABC
法一:将str1每次旋转一个字符比较是否与str2相等,依次比较直至旋转完所有的字符,在此期间若两字符串相等返回1,否则返回0。
#include <stdio.h>
#include <assert.h>
#include <string.h>
int is_string_rotation1(char* str1, char* str2) {
assert(str1);
assert(str2);
int i = 0;
int n = strlen(str1);
for (i = 0; i < n; i++) {
//每次旋转一个字符
char temp = *str1;
int j = 0;
//后面n-1个字符向前移动
for (j = 0; j < n - 1; j++) {
*(str1 + j) = *(str1 + j + 1);
}
//将temp放在最后
*(str1 + n - 1) = temp;
//比较是否相同
if (strcmp(str1, str2) == 0) {
return 1;
}
}
return 0;
}
int main() {
char arr1[20] = "AABCD";
char arr2[] = "DAABC";
int ret=is_string_rotation1(arr1, arr2);
if (1 == ret) {
printf("yes\n");
}
else {
printf("no\n");
}
return 0;
}
运行结果:

法二:使用库函数strncat在str1字符串后追加一个str1字符串,这样追加后的str1字符串有没追加str1之前的字符串所有旋转的情况,再判断str2是否是str1追加之后的字串,若是字串返回1,否则返回0。
#include <stdio.h>
#include <assert.h>
#include <string.h>
int is_string_rotation2(char* str1, char* str2) {
assert(str1);
assert(str2);
if (strlen(str1) != strlen(str2)) {//两个字符串不相等,不可能旋转得到
return 0;
}
//str1字符串后追加一个str1
//strcat(str1, str1);
int len = strlen(str1);
strncat(str1, str1, len);
//判断str2是否为str1的字串
char* ret=strstr(str1, str2);
return ret != NULL;
}
int main() {
char arr1[20] = "AABCD";
char arr2[] = "DAABC";
int ret=is_string_rotation2(arr1, arr2);
if (1 == ret) {
printf("yes\n");
}
else {
printf("no\n");
}
return 0;
}
运行结果:
