今天遇见一个比较有趣的问题,用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;
}