描述
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA是由AABCD两次移位后产生的新串BCDAA的子串,而ABCD与ACBD则不能通过多次移位来得到其中一个字符串是新串的子串。
输入
一行,包含两个字符串,中间由单个空格隔开。字符串只包含字母和数字,长度不超过30。
输出
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出true,否则输出false。
样例输入
AABCD CDAA
样例输出
true
#include<stdio.h>
#include<string.h>
int f(char *s1,char *s2) //判断后者(s2)是否为前者(s1)子串
{
if(strstr(s1,s2)!=NULL) //strstr找出s2字符串在s1字符串第一次出现的位置,若找不到,返回空指针
return 1; //s2是s1子串
else
return 0; //s2不是s1子串
}
int main()
{
int i,j;
char t;
char s1[31]={0}, s2[31]={0};
scanf("%s %s",s1,s2); //题目要求两个字符串中间只能有一个空格,不能用gets读入(nt作者就卡在这里很久,没看要求,可恶啊)
int len1 = strlen(s1); //读入s1长度
int len2 = strlen(s2); //读入s2长度
if(len2>=len1) //对长度大的字符串进行循环移位,因为长度小的字符串为子串,位置不能变(例如:ABCD和DA,应该是前者移位,而不是后者)
{
for(i=0;i<len2;i++) //循环移位len次回到最初顺序
{
if(f(s2,s1)==1) //s1是s2子串,返回1,满足条件,直接输出true,然后结束
{
printf("true\n");
return 0;
}
else //s1不是s2子串,进行移位
{
t=s2[0]; //第一个字符保存起来
for(j=0;j<len2-1;j++) //将后一个元素覆盖前一个元素
{
s2[j]=s2[j+1];
}
s2[len2-1]=t; //最后一个元素赋值为第一个元素
}
}
}
else //同理
{
for(i=0;i<len1;i++)
{
if(f(s1,s2)==1)
{
printf("true\n");
return 0;
}
else
{
t=s1[0];
for(j=0;j<len1-1;j++)
{
s1[j]=s1[j+1];
}
s1[len1-1]=t;
}
}
}
printf("false\n"); //函数没有结束,说明循环了len次都不满足条件,输出false
return 0;
}