请教这道题目,写了两种代码,样例都能通过,可就是被平台判错,请问错误在那个地方,不用直接给代码
问题遇到的现象和发生背景
字符串移位包含问题
描述
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA是由AABCD两次移位后产生的新串BCDAA的子串,而ABCD与ACBD则不能通过多次移位来得到其中一个字符串是新串的子串。
输入
一行,包含两个字符串,中间由单个空格隔开。字符串只包含字母和数字,长度不超过30。
输出
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出true,否则输出false。
样例输入
AABCD CDAA
样例输出
true
我的解答思路和尝试过的方法
#include <stdio.h>
#include <string.h>
int main()
{
char s1[35],s2[35],t;
scanf("%s %s",s1,s2);
int la=strlen(s1),lb=strlen(s2),i,j,m=0;
for(i=0;i<la-1;i++){//对s1字符循环向左移一位,首尾特殊处理
t=s1[0];
for(j=0;j<la-1;j++){
s1[j]=s1[j+1];
}
s1[la-1]=t;
// printf("%s %s\n",s1,s2);
if(strstr(s1,s2)!=NULL||strstr(s2,s1)!=NULL){//判断s1,s2只要有一满足子符串关系,就完成
printf("true");
m++;
break;
}
}
if(m==0){
for(i=0;i<lb-1;i++){//对s2字符循环向左移一位,首尾特殊处理
t=s2[0];
for(j=0;j<lb-1;j++){
s2[j]=s2[j+1];
}
s2[lb-1]=t;
if(strstr(s2,s1)!=NULL||strstr(s1,s2)!=NULL){//判断s1,s2只要有一满足子符串关系,就完成
printf("true");
m++;
break;
}
}
}
if(m==0)
printf("false");
return 0;
}
```c
```c
#include <stdio.h>
#include <string.h>
int main()
{
char s1[35],s2[35],t;
scanf("%s %s",s1,s2);
int la=strlen(s1),lb=strlen(s2),i,j,m=0;
if (la>lb){//为使s1成为字符串长度比s2更短的子符串
for(i=0;i<la||i<lb;i++){
t=s1[i];
s1[i]=s2[i];
s2[i]=t;
}
}
// printf("%s %s\n",s1,s2);
for(i=0;i<la-1;i++){//字符循环向左移一位 ,首尾特别处理
t=s1[0];
for(j=0;j<la-1;j++){
s1[j]=s1[j+1];
}
s1[la-1]=t;
// printf("%s %s\n",s1,s2);
if(strstr(s2,s1)!=NULL){//判断s1是否为s2子符串
printf("true");
m++;
break;
}
}
if(m==0)
printf("false");
return 0;
}