法1:
判断是否是其左旋再判断是否是右旋。
#include
#include
#include
void Reverse(char* left, char* right)
{
while (left
{
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
{
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;
}