写这一道题,首先搞明白左旋、右旋的定义:
对于“左旋”定义的理解:
AABCD左旋一个字符得到ABCDA;
AABCD左旋两个字符得到BCDAA;
对于“右旋”定义的理解:
AABCD右旋一个字符得到DAABC
例如:
给定s1 =AABCD和s2 = BCDAA,AABCD 可以 通过旋转得到BCDAA, 则返回1;
给定s1 =AABCD和s2 = BCDAB,AABCD不可以通过旋转得到BCDAB, 则返回0。
int AA(char*arr1, char*arr2)
{
char arr[1024] = { 0 };
int len = strlen(arr1), i, m = 0, n = 0, count = 0;
for(i = 0; i < len;i++)
{
*(arr + i) = *(arr1 + i);
*(arr + len + i) = *(arr1 + i);
}
int len1 = strlen(arr);
while (n<len && m<len1)
{
if (*(arr + m) == *(arr2 + n))
{
for (; *(arr + m) == *(arr2 + n) && n<len; m++, n++)
{
count++;
}
if (count != len)
{
m = m - count+1;
n = n - count;
count = 0;
}
else if (count == len)
return 1;
}
else
m++;
}
return 0;
}
int main(void)
{
char arr1[] = "gergergergvdfvr";
char arr2[] = "gergvdfvrgerger";
if (AA(arr1,arr2) == 1)
printf("YES \n");
else
printf("no \n");
return 0;
}
代码整体思路
先将两个需要比较的字符串分别存入arr1、arr2之中,再将arr1之中的字符串重复一遍。
为什么要重复一遍呢?
因为重复一遍之后,此时的字符串就相当于拥有了全部的“旋转可能”!
通过代码实现arr2是否是arr1的子集,便可以知道结果,此种方法并非暴力破解法。
代码实现图: