判断一个字符串是不是另一个字符串旋转后的结果暴力求解

文章介绍了如何使用C语言编写一个函数,来判断一个字符串是否可以通过左移其他字符串的字符得到。方法包括比较两个字符串长度,遍历查找相同字符并记录起始位置,处理不同情况如字符串结束和循环查找。给出了源代码示例。
摘要由CSDN通过智能技术生成

        今天遇见一个比较有趣的问题,用c语言写一个函数判断一个字符串是不是另一个字符串左旋几个字符得到,的比如字符串s1="abcd";s2="bcda"。s2就是s1左移一个字符得到的;那么怎么判断呢我的思路如下希望对读者有些帮助,如果有些条件考虑不全可以在评论区写出,我会尽快处理。

1.基本思路

        我的思路是首先判断两个字符串长度是否相等如果,从s1的首地址开始找字符,在'\0'之前如果找到S1其中的字符和s2第一个字符相同后首先判断S1和S2是否为'\0',如果S2为'\0'直接就返回1(注:返回1,为真即s2是s1左旋某个字符得到的,返回0为假)如果S1到了'\0'这里我们就要将指针指到字符串的首地址。判断完了S1 S2以后S1 S2各向后加一比较下一字符是否相等。

        不相等情况较多在这里另外讨论,首先判断不相等S1是否走到'\0',如果到'\0'那么我们就要将指针指到字符串的首地址;在这里将指针指到'\0'之前我们还得判断一下在此之前有没有过S1跑到首地址之前。如果有直接return0,判断完以上情况后应该让S1向后走一步 以寻找和S2相同的字符。

        到此还有一种情况,在第一段检索到相同后,后面不同了怎么办比如S1="223131323123",S2="212312311231"这两个字符串就很难判断,所以我们在第一段检索到相同字符时必须记下s1的地址,同时将s1置为初始地址。然后执行上两段的情况;

这是源代码:

#include <stdio.h>
#include <string.h>

int left_arr(char* s1, char* s2)
{
	if (strlen(s1) != strlen(s2))
	{
		return 0;
	}
	int count = 0;
	char* start2 = s2;
	char* start1 = s1;
	int num = 0;
	char* bid = NULL;
	while (*s2)
	{
		
		if (*s2 != *s1)
		{
			if (!*s1)
			{
				if (count == 1)
				{
					break;
				}
				count = 1;
				s1 = start1;
				continue;
			}
			if (count == 1)
			{
				return 0;
			}
			if (num == 1)
			{
				s1 = bid;
				s2 = start2;
				count = 0;
				num = 0;
			}
			s1++;
		}
		else
		{
			
			if (num == 0)
			{
				bid = s1;
			}
			if (!*s2)
			{
				return 1;
			}
			if (!*s1)
			{
				s1 = start1;
				continue;
			}
			s1++;
			s2++;
			num = 1;
		}
	}	
	return 1;
}

int main()
{
	char s1[] = "12321312323121";
	char s2[] = "11232131232313";
	int ret = left_arr(s1, s2);
	if (ret == 1)
	{
		printf("1");
	}
	else
	{
		printf("0");
	}
	return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白_moon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值