题目描述:
判断亲和串。亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。
输入
本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。
输出:
如果s2是s1的亲和串,则输出"yes",反之,输出"no"。每组测试的输出占一行。
样例输入
AABCD CDAA ASD ASDF ab aba
样例输出 Copy
yes no no
方法一:
将s1的每一个字符都当第一个字符成立一个串,从开头第一个与s2分别比对s2中每一个都与s1的变串相等则说明找到了一个这样的串,就可以输出了,如果每一个s1的字符都做过开头仍未找到,则不存在;这种方法比方法二更麻烦花费的时间也更多。
#include<stdio.h>
#include<stdlib.h>
int panduanqinhechuan(int i,char *ps1,char *ps2,int s1c,int s2c){
int s3c=0,x=0,daiqu=0,qu=1;
x=(i+x)%s1c;
char x2[2];
x2[0]=ps1[x];
ps1[x]=ps1[0];
while(1){
if(x==0){
ps1[(i+x)%s1c]=x2[daiqu];
break;
}
x=(i+x)%s1c;
x2[qu]=ps1[x];
ps1[x]=x2[daiqu];
char temp=x2[daiqu];
x2[daiqu]=x2[qu];
x2[qu]=temp;
}
x=0;
int sum=0;
while(ps1[x]!='\0'){
if(ps1[x]==ps2[x]){
sum++;
}
x++;
}
return sum;
}
int main(){
char s1[100000],s2[100000];
char*ps1=s1,*ps2=s2;
while((scanf("%s %s",s1,s2))!=EOF){
int s1c=0,s2c=0;
while(s1[s1c]!='\0'){
s1c++;
}
while(s2[s2c]!='\0'){
s2c++;
}
if(s2c>s1c){
printf("no\n");
}else{
for(int i=0;i<s1c-1;i++){
if(panduanqinhechuan(i>0?1:0,ps1,ps2,s1c,s2c)==s2c){
printf("yes\n");
break;
}
}
}
}
return 0;
}
运行结果:

提交结果:

方法二:
让s2的第一个字符分别与每一个s1中的字符对比如果相等开始比较接下来的字符。如果s1结束则找到开头往后在比较,如果s2与s1经过这样的比较仍然相等则s2是s1的一个亲和串。
#include<stdio.h>
#include<stdlib.h>
int panduanqinhechuan(int i,char *ps1,char *ps2,int s1c,int s2c){
int s3c=0,x=0,daiqu=0,qu=1;
x=(i+x)%s1c;
char x2[2];
x2[0]=ps1[x];
ps1[x]=ps1[0];
while(1){
if(x==0){
ps1[(i+x)%s1c]=x2[daiqu];
break;
}
x=(i+x)%s1c;
x2[qu]=ps1[x];
ps1[x]=x2[daiqu];
char temp=x2[daiqu];
x2[daiqu]=x2[qu];
x2[qu]=temp;
}
x=0;
int sum=0;
while(ps1[x]!='\0'){
if(ps1[x]==ps2[x]){
sum++;
}
x++;
}
return sum;
}
int main(){
char s1[100000],s2[100000];
char*ps1=s1,*ps2=s2;
while((scanf("%s %s",s1,s2))!=EOF){
int s1c=0,s2c=0;
while(s1[s1c]!='\0'){
s1c++;
}
while(s2[s2c]!='\0'){
s2c++;
}
if(s2c>s1c){
printf("no\n");
}else{
for(int i=0;i<s1c-1;i++){
if(panduanqinhechuan(i>0?1:0,ps1,ps2,s1c,s2c)==s2c){
printf("yes\n");
break;
}
}
}
}
return 0;
}
运行结果:

提交结果:
![]()
博客围绕C语言判断亲和串展开,亲和串指通过s1循环移位使s2包含在s1中。介绍了多组测试数据的输入输出要求,给出两种判断方法,方法一将s1各字符当首字符成串与s2比对,较麻烦耗时;方法二让s2首字符与s1各字符对比后继续比较后续字符。
1002

被折叠的 条评论
为什么被折叠?



