字符串移位包含问题。
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA
是由AABCD
两次移位后产生的新串BCDAA
的子串,而ABCD
与ACBD
则不能通过多次移位来得到其中一个字符串是新串的子串。
输入:
一行,包含两个字符串,中间由单个空格隔开。字符串只包含字母和数字,长度不超过3030。
输出:
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出true
,否则输出false
。
输入样例:
AABCD CDAA
输出样例:
true
答案:
法一:
// 1 输入
// 2 找出长的字符串a
// 3 strcat变两倍 a
// 4 strstr函数 判断 b 是否在 a 内
#include<stdio.h>
#include<string.h>
int main()
{
char a[100],b[100],c[100]; // 定义大一点的数,下面字符串 a 需要变两倍
int x,y;
scanf("%s",a);
scanf("%s",b);
x=strlen(a);
y=strlen(b);
if(x<y){
strcpy(c,a);
strcpy(a,b);
strcpy(b,c);//保证a为长的字符串
}
strcpy(c,a); //c=a;
strcat(a,c); //把c加到a后面 两倍 a
if(strstr(a,b)==NULL) //该函数返回 a中第一次出现 b字符串的位置,如果未找到则返回 null。
printf("false");
else
printf("true");
return 0;
}
法二:
递归排序
#include<bits/stdc++.h>
#include<string.h>
using namespace std;
int main()
{
char a[35],b[35],c[35];
cin>>a>>b;
int t=a[0],f=0;
int x,y;
x=strlen(a);
y=strlen(b);
if(x<y)
{
strcpy(c,a);
strcpy(a,b);
strcpy(b,c); //保证a为长的字符串,b为子串
}
for(int i=0;i<strlen(a);i++)
{
t=a[0];
for(int j=0;j<strlen(a)-1;j++)
{
a[j]=a[j+1];
}
a[strlen(a)-1]=t;
if(strstr(a,b)==NULL) {f=0;}
else {f=1;break;
}
}
if(f==1) cout<<"true";
else if(f==0) cout<<"false";
return 0;
}