题目是这样的:
1163: 亲和串(字符串)
时间限制: 1 Sec 内存限制: 128 MB
提交: 6635 解决: 2951
[状态] [讨论版] [提交] [命题人:admin]
题目描述
判断亲和串。亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。
输入
本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。
输出
如果s2是s1的亲和串,则输出"yes",反之,输出"no"。每组测试的输出占一行。
样例输入 Copy
AABCD
CDAA
ASD
ASDF
ab
aba
样例输出 Copy
yes
no
no
来源/分类
我的代码(样例输出没问题,提示输出超限,代码我加注了,希望指点,看看我的逻辑哪里错了(还是连思路都错了))
如果有更好的思路,求!!!
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#include<ctype.h>
#include<string.h>
#include<limits.h>//这些头文件是之前懒省事全加上了
void exchange(char *p,int lo);
int main()
{
char a[100001],b[100001];
int i;
while(1)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));//清空数组
gets(a);
gets(b);
int loa=strlen(a);
int lob=strlen(b);//求两数组长度
char lowtime[lob];/*设置一个数组来从前往后截取a数组长度lob的部分
(想用strcmp比较两数组是否相等)*/
int f;
for(f=0;f<loa;f++)
{
strncpy(lowtime,a,lob);//截取数组
if(strcmp(b,lowtime)==0)//如果数组a前lob个位置与数组b相等
{
printf("yes");
break;
}
exchange(a,loa);//如果不相等的话,定义一个函数移位
}
if(f==loa) printf("no");//如果经历了完整的循环仍然不能相等,输出no
printf("\n");
}
return 0;
}
void exchange(char *p,int lo)
{
int t=*(p+lo-1);//把数组最后一个位置的值赋给t
for(int i=lo-2;i>=0;i--)//数组往后移一位
*(p+i+1)=*(p+i);
p[0]=t;//再把原末尾值赋给首位置
}