题目:判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 = AABCD和s2 = BCDAA,返回1
给定s1 = abcd和s2 = ACBD,返回0
AABCD左旋一个字符得到 ABCDA
AABCD左旋两个字符得到 BCDAA
AABCD右旋一个字符得到 DAABC
思考:首先这道题的题意我看的有点懵,题目说的是:有一个字符串str1(假设),先将str1旋转之后得到str2字符串,然后自定义一个字符串str3,看str3是否等于str2?
但是列子给的是两个字符串,并没有说要旋转几次,而且我看到很多其他的博客中写的代码是:先复制一个str1,然后接在str1后面,判断的是子字符串,这个有点搞不懂为啥要判断子字符串?后来我想了想,可能也是一种方法,这个方法不用判断str1旋转了几次,只要你是新加字符串的子字符串就一定符合题意。
我首先第一个思路就是,我在每一次旋转之后来一个判定,如果相等的话就直接跳出循环并且返回1,如果循环次数完之后两个字符串还没有相等就直接返回0
代码敬上~
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int judge(char str1[], char str2[])
{
int i = 0;
int j = 0;
int len = strlen(str1);
for (j = 1; j <= len; ++j)
{
int tmp = str1[0];
for (i = 0; i < len - 1; ++i)
{
str1[i] = str1[i + 1];
}
str1[len - 1] = tmp;
if (strcmp(str1, str2) == 0)
{
return 1;
}
}
return 0;
}
int main()
{
//char s1[10] = "AABCD";
//char s2[10] = "BCDAA";
char s1[10] = "abcd";
char s2[10] = "ACBD";
printf("s1 = %s\n", s1);
printf("s2 = %s\n", s2);
if (judge(s1, s2))
{
printf("字符串旋转之后可以等于指定字符串!");
}
else
{
printf("字符串旋转之后不会等于指定字符串!");
}
system("pause");
return 0;
}
以下这种方法是先复制一串字符串到目标字符串的后面,然后判断另一个字符串是不是那个字符串的子字符串
比如:str1 = ABCD 先复制str1到str2中,使得str2 = ABCDABCD
然后判断str3 = BCAD(假设)是不是str2的子字符串,如果是则满足题意返回1,否则返回0
char* my_strncat(char *stc)//复制源字符串接在目的字符串后面
{
char *cp = stc ;//cp = ABCD
int len = strlen(stc);//4
char *cpp = stc;
while (*cpp)
{
++cpp;
}
while (*cp !='\0'&& (len--))
{
*cpp++ = *cp++;
}
*cpp = '\0';
return cpp;
}
char str1[20] = "ABCD";
char str2[20] = "BACD";
char *ret = NULL;
my_strncat(str1);
ret = strstr(str1, str2);
if (ret)
{
printf("字符串str2是str1字符串旋转之后的字符串!");
}
else
{
printf("字符串str2不是str1字符串旋转之后的字符串!");
}