目录
- 写一个函数,判断一个字符串是否是另外一个字符串旋转之后的字符串
例如:str1:ABCDEF str2:CDEFAB 输出Yes
str1:ABCDEF str2:CDEFAA 输出No
方法一:暴力穷举法
我们依据左旋字符串那道题改编一下;
思路:
题目要求一个字符串是否是另外一个字符串旋转之后的字符串,我们可以将str1进行遍历旋转,旋转一次跟str2比较一下,旋转str1字符串长度次结束
#include<string.h>
#include<stdio.h>
int reverseLeftWords(char* str1, char*str2)
{
int len = strlen(str1);//计算字符串长度
int i = 0;
for (i = 0; i < len; i++)//循环k次
{
int j = 0;
char temp = *str1;//把第一个元素存放起来
for (j = 0; j < len - 1; j++)
{
*(str1 + j) = *(str1 + j + 1);//把后面的元素往前挪动
}
*(str1 + len - 1) = temp;//把最后一个元素放第一次存起来的元素
if (strcmp(str1, str2) == 0)
{
return 1;
}
}
return 0;
}
int main()
{
char str1[20] = "ABCDEF";
char str2[] = "ABCDEF";
int k = 0;
int ret = reverseLeftWords(str1, str2);
if (1 == ret)
{
printf("yes\n");
}
else {
printf("no\n");
}
return 0;
}
方法二:
str1为ABCDEF
我们可以给str1追加上一个str1,就变成ABCDEFABCDEF ,就这样str1的所有子串都包含在这个追加字符串之后的字符串我们就可以拿str2出来看str2是否是str1的子串。
需要注意的是
如果str2为BCD也是str1的字串,但它并不是str1旋转之后来的,所以我们还要加一个判定条件就是两个字符串长度必须相等。
另外我们这里需要用两个库函数
strcncat:他有三个参数拿strncat(str1,str1,5)来举例,就是在str1后面追加一个str1的字符串且长度为五
strstr :判断一个字符串是否是另外一个字符串的子串,如果不是返回空指针NULL;
#include<string.h>
#include<stdio.h>
int reverseLeftWords(char* str1, char* str2)
{
int n1 = strlen(str1);
int n2 = strlen(str2);
if (n1 != n2)//两个字符串长度必须相等
{
return 0;
}
//追加一个字符串
strncat(str1, str1, 5);
//判断一个串是否是另外一个字符串的字串
char* ret=strstr(str1, str2);
return ret != NULL;//如果不是空指针就返回1,是空指针就返回空指针也就是0
}
int main()
{
char str1[20] = "ABCDEF";
char str2[] = "CDEFAB";
int k = 0;
int ret = reverseLeftWords(str1, str2);
if (1 == ret)
{
printf("yes\n");
}
else {
printf("no\n");
}
return 0;
}