写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
有两种思路:
1、每左旋一个字符,判断是否和输入的字符串相等。
2、给原字符串后面追加其本身,查找输入的字符串是否为追加后的字符串的子串。
给出代码:
第一种方法:
#include <stdio.h>
#include <assert.h>
#include <string.h>
int Judge(char* str1, char* str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
if (strlen(str1) != strlen(str2))//长度不一就不是
{
return -1;
}
if (strcmp(str1, str2) == 0)//输入的字符串和原字符串相同
{
return 1;
}
int len = strlen(str1);
int i = 0;
int j = 0;
while (i < len)//旋转的次数进行n-1次
{
//左旋一次
char tmp = *str1;
for (j = 0; j < len - 1; j++)
{
*(str1 + j) = *(str1 + j + 1);
}
*(str1 + len - 1) = tmp;
//判断
if (strcmp(str1, str2) == 0)
{
return 1;
}
i++;
}
return -1;
}
int main()
{
char arr1[100] = "ABCDEFG";
char arr2[50] = "";
scanf("%s", arr2);
int ret = Judge(arr1, arr2);
if (ret == 1)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
return 0;
}
思路和左旋字符串是一样的,不过是改变了左旋的次数。
详细请看:C语言左旋字符串_TIED_Space-CSDN博客
第二种方法:
这种方法还是要对库函数有一些了解的
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{
char arr1[100] = "ABCDEFG";
char arr2[50] = "";
scanf("%s", arr2);
if (strlen(arr1) != strlen(arr2))//长度不同就不是
{
printf("NO\n");
return 0;
}
strncat(arr1, arr1, strlen(arr1));//在arr1后追加本身字符串
if (strstr(arr1, arr2) != NULL)//arr2是否为arr1子串
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
但基本思路就是在字符串后添加本身,然后再看输入的字符串是不是其的子串
例如:ABCDEFG后追加自身之后为ABCDEFGABCDEFG,例如要查找CDEFGAB,那么会发现其是前面字符串的子串,所以就是旋转来的。
水平有限,欢迎指正。