对一个长度为len的字符串而言,左旋k个字符就相当于右旋len-k个字符。所以对于判断字符串是否由另一个字符串旋转得到,我们可以通过其任一种方式进行判断。
思路1:
给定两个已知的长度相等的字符串,通过for循环,通过每次对字符串进行左旋一个的操作,和需要判断的字符串做strcmp操作。循环终止条件是遍历完字符串的字符,即不超过字符串的长度。
源代码如下:
#include <stdio.h>
#include <windows.h>
#include <assert.h>
#include <string.h>
#pragma warning (disable:4996)
void reverse(char *left, char *right)
{
while (left < right)
{
*left ^= *right;
*right ^= *left;
*left ^= *right;
left++; right--;
}
}
void left_move(char *str, int k)
{
int len = strlen(str);
assert(str != NULL && k <= len);//DEBUG
if (str == NULL || k > len)
{
return; //release
}
reverse(str, str + k - 1);
reverse(str + k, str + len - 1);
reverse(str, str + len - 1);
}
int Is_left_move(char *arr, const char*p)
{
int i = 0;
int len =strlen(arr);
assert(arr != NULL && p != NULL && strlen(arr) == strlen(p));
for (; i < len; i++)
{
left_move(arr, 1); //每次循环旋转1次
if (strcmp(arr, p)==0)
{
return 1; //是
}
}
return 0;//不是
}
int main()
{
char str[] = { "abcdef" };
char *str1 = "cdefab";
int ret = Is_left_move(str, str1);
if (ret == 1)
{
printf("is move\n");
}
else
{
printf("is not move\n");
}
system("pause");
return 0;
}
思路2:
将字符串进行拼接操作(自己拼自己),在拼接好后的字符串中查找有没有该需要判断的字符串,如果有证明是旋转得到,没有则证明不是旋转得到。该方法不用去看旋转多少次。
“abcd”–>“abcdabcd” p=“cdab”
源代码如下:
int Is_left_move(char *arr, const char*p)
{
int len = strlen(arr);
assert(arr != NULL && p != NULL && strlen(arr) == strlen(p));
strncat(arr, arr, len); // '\0' abcdabcd
if (strstr(arr, p)!=NULL)
{
return 1;
}
return 0;
}
int main()
{
char str[20] = { "abcdef" }; //如果不加‘20’,长度是6,拼接自己长度是7 变成13 ,会崩溃 数组越界了
char *str1 = "cdefab";
int ret = Is_left_move(str, str1);
if (ret == 1)
{
printf("is move\n");
}
else
{
printf("is not move\n");
}
system("pause");
return 0;
}