描述
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA是由AABCD两次移位后产生的新串BCDAA的子串,而ABCD与ACBD则不能通过多次移位来得到其中一个字符串是新串的子串。
输入
一行,包含两个字符串,中间由单个空格隔开。字符串只包含字母和数字,长度不超过30。
输出
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出true,否则输出false。
样例输入
AABCD CDAA
样例输出
true
方法一:直接用i控制位移次数,a[ ]记录每一次移动过的字符串,然后进行比较短的字符串是不是长的字符串的子串。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char s1[40]= {0},a[40]= {0},s2[40]= {0};
int i=0,j=0,k=0,len;
int flag=-1;
scanf("%s %s",s1,s2);
if(strlen(s1)>=strlen(s2))
{
len=strlen(s1);
for(i=0; i<len; i++)
{
for (j=0; j<len; j++)
{
a[j]=s1[(j+i)%len];
}
j=0;
k=0;
while (k<len)
{
if (a[k]==s2[j])
{
j++;
k++;
if (j==strlen(s2))
{
flag=0;
printf("true");
return 0;
}
}
else if (a[k]!=s2[j]&&j<strlen(s2))
{
k=k-j+1;
j=0;
}
}
}
}
else if(strlen(s1)<strlen(s2))
{
len=strlen(s2);
for(i=0; i<len; i++)
{
for (j=0; j<len; j++)
{
a[j]=s2[(j+i)%len];
}
j=0;
k=0;
while (k<len)
{
if (a[k]==s1[j])
{
j++;
k++;
if (j==strlen(s1))
{
flag=0;
printf("true");
return 0;
}
}
else if (a[k]!=s1[j]&&j<strlen(s1))
{
k=k-j+1;
j=0;
}
}
}
}
if (flag==-1)
printf("false");
return 0;
}
方法二:将长的字符串复制两遍得到一个新的的字符串,用子串在这个新的字符串寻找。(如输入:ghjas asdfghj。得到新串asdfghjasdfghj,在新串里寻找子串)。
1、调用库函数
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char s1[35]= {0},s2[35]={0};
char s3[70]={0};//s3用来储存新字符串
scanf("%s %s",s1,s2);
if (strlen(s1)>=strlen(s2))
{
strcpy(s3,s1);
strcat(s3,s1);//将s1复制两次放在s3中
if(strstr(s3,s2)!=NULL)//调用库函数判断子串
{
printf("true");
}
else
{
printf("false");
}
}
// if (strlen(s1)<strlen(s2))
else
{
strcpy(s3,s2);
strcat(s3,s2);//将s1复制两次放在s3中
if(strstr(s3,s1)!=NULL)//调用库函数判断子串
{
printf("true");
}
else
{
printf("false");
}
}
return 0;
}
2、普通方法
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char s1[72]={0},s2[72]={0};
char s3[70]={0};
int i=0,k=0;
int j=0;
int len=0;
scanf("%s %s",s1,s2);
if (strlen(s1)>=strlen(s2))
{
len=strlen(s1);
for (j=len;j<2*len;j++)//将短的字符串连在长的字符串的子串后面
{
s1[j]=s1[j-len];
}
while (i<strlen(s1)&&k<strlen(s2))//检验是不是子串
{
if (s2[k]==s1[i])
{
i++;
k++;
}
else
{
i=i-k+1;
k=0;
}
}
if (k==strlen(s2))
printf("true");
else
printf("false");
}
else
{
len=strlen(s2);
for (j=len;j<2*len;j++)//将短的字符串连在长的字符串的子串后面
{
s2[j]=s2[j-len];
}
while (i<strlen(s2)&&k<strlen(s1))//检验是不是子串
{
if (s1[k]==s2[i])
{
i++;
k++;
}
else
{
i=i-k+1;
k=0;
}
}
if (k==strlen(s1))
printf("true");
else
printf("false");
}
return 0;
}
从思路上说,第二种更简单。