对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA是由AABCD两次移位后产生的新串BCDAA的子串,而ABCD与ACBD则不能通过多次移位来得到其中一个字符串是新串的子串。
Input
一行,包含两个字符串,中间由单个空格隔开。字符串只包含字母和数字,长度不超过30。
Output
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出true,否则输出false。
Sample Input
AABCD CDAA
Sample Output
true
用求余来写,英语一定要学好哦,,,,我把false 不小心写成了flase,呵,找错误找的我,,,,欸,不说了。
#include<stdio.h>
#include<string.h>
int main()
{
char mo[31]; //后文将此称为母数组 (mother)
char son[31];
char t[31]; //后文将此称为子数组 (son)
scanf("%s",mo);
scanf("%s",son);
//如果son比mo长,那就用函数交换位置。
if(strlen(mo)<strlen(son)) {
strcpy(t,mo);strcpy(mo,son);strcpy(son,t);
}
//
int i,j; //定义变量flag.
int Son_Len=strlen(son); //子数组长度
int Mo_Len=strlen(mo); //母数组长度
//在母数组中查找,找到每一个和子数组第一个元素相同的元素
for(i=0;i<Mo_Len;i++)
// 如果该元素和子数组第一个元素相同。
if(mo[i]==son[0]){
int k=0, flag = 0;
for(j=i;j<i+Son_Len;j++,k++) //j=i,然后母数组从i处起一个一个和子数组中的元素比较
//如果相同,则flag++;
{
//对母数组求余,相当于做了一个循环
if(mo[j % Mo_Len]==son [k]) flag++;
else break;
}
if(flag == Son_Len) {printf("true\n"); break;}
}
/*ASDFG ZXCVB如果是这种母子数组没有一个相同的呢?如果循环到i==Molen_-1dehsihou都还没有发现相同字符,好,输出false,不是flase哦,,,*/
else if(i == Mo_Len-1) printf("false\n");
}
ok,AC了。关于我这种低级的错误,,,我只想说呵呵哒,,不过检查的过程中也加深了理解,哈哈,有得有失。