判断一个字符串是否为另外一个字符串旋转之后的字符串

一道编程题,要求判断一个字符串是否为另一个字符串旋转后的形式。例如s1=AABCD,s2=BCDAA返回1。可以采取每次旋转比较是否相等的方法,或者判断原字符串与自身拼接后的子字符串是否包含另一个字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定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字符串旋转之后的字符串!");
	}