法1:
判断是否是其左旋再判断是否是右旋。
#include#include #include void Reverse(char* left, char* right){ while (left < right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; }}char* Left_Reverse(char* arr, int k, int len)//接收,否则无法将变化的字符串和arr2比较{ char* cur = arr; Reverse(arr, arr + k - 1); Reverse(arr + k, arr + len - 1); Reverse(arr, arr + len - 1); return cur;}char* Right_Reverse(char* arr, int k, int len)//接收{ char* cur = arr; Reverse(arr, arr + len - k - 1); Reverse(arr + len - k, arr + len - 1); Reverse(arr, arr + len - 1); return cur;}int main(){ char arr1[] = "AABCD"; char arr2[] = "CDAAB"; int len = strlen(arr1); int k = 0; //判断是否左旋得到 for (k = 0; k < len; k++) { char* ret1 = Left_Reverse(arr1, k, len); if (strcmp(ret1, arr2) == 0) { printf("左旋\n"); break; } } //判断是否右旋得到 char _arr1[] = "AABCD"; //之前的arr1经过左旋后已经发生了改变 k = strlen(arr1); //k = len主要想从不旋转开始比较字符串 char* ret2 = NULL; while (k > 0) { ret2 = Right_Reverse(_arr1, k, len); if (strcmp(ret2, arr2) == 0) { printf("右旋\n"); break; } k--; } if ((k == 0) && (strcmp(ret2, arr2) != 0)) { printf("既不是左旋又不是右旋\n"); } system("pause"); return 0;}
法2:
判断一个字符串是否是另一个字符串自身连接的子串。
假设两个字符串分别为ABCD和DCBA,将第一个字符串“ABCD”连接成新的字符串“ABCDABCD”。再比较新的字符串"ABCDABCD“与字符串”DCBA“,判断字符串”DCBA“是不是另一个字符串的子串。如果是,则说明是旋转字符串。
#define _CRT_SECURE_NO_WARNINGS 1#include#include #include #include char* my_strncat(char* dest, char* src, int size){ assert(dest); assert(src); char* tmp = dest; while (*dest) { dest++; } while (size) { *dest++ = *src++; size--; } *dest = '\0'; return tmp;}int main(){ char arr1[15] = "AABCD"; char arr2[] = "BCDAA"; int len = strlen(arr1); char* ret1 = my_strncat(arr1, arr1, len);//ret1是arr1自己连接自己后的字符串 char* ret2 = strstr(ret1, arr2); if (*ret2 == NULL) { printf("不是!"); } else { printf("是!"); } system("pause"); return 0;}