T1117 字符串移位包含问题
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串 s1和 s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA
是由AABCD
两次移位后产生的新串BCDAA
的子串,而ABCD
与ACBD
则不能通过多次移位来得到其中一个字符串是新串的子串。
输入格式
一行,包含两个字符串,中间由单个空格隔开。字符串只包含字母和数字,长度不超过 30。
输出格式
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出"true"
,否则输出"false"
。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
AABCD CDAA
样例输出
true
解题思路: 见代码
#include<stdio.h>
#include<string.h>
int s=0,z;
char S1[32],S2[32];
void Cyclic_shift(char S[]){
int i,k;
k=strlen(S);
S[k]=S[0]; //手动将第一个元素复制到最后的多出来的字符元素中
for (i=0;i<=k;i++){
S[i]=S[i+1]; //将字符串中的字符数组元素按顺序复制到下一个字符数组元素中
}
S[k]='\0'; //将末尾手动添加结束字符
s++; //计数,循环的次数
}
int judgment(char X[],char Y[]){//判断子串
int i,j,K;
for (i=0;i<strlen(X);i++){//此处为较长的字符串
for (j=0;j<strlen(Y);){//此处为较短的字符串,用于判断与长串是否一致
if (Y[j]==X[i+j]) j++;
else break;
if (j==strlen(Y)){
K=1;break;//一致的话,K=1
}
}
}
return K;
}
void lowerchar(char X[]){//将字符串变成小写字母,此时可忽略字母大小写带来的影响
int i;
for (i=0;i<strlen(X);i++)
X[i]+=(X[i]<=90&&X[i]>=65)?32:0;
}
void function(char X[],char Y[]){
while (judgment(X,Y)==0&&s!=strlen(X)){
Cyclic_shift(X);
}
if (judgment(X,Y)) z=1;
else z=0;
}
int main()
{
scanf("%s %s",S1,S2);
lowerchar(S1);
lowerchar(S2);
if (strlen(S1)>strlen(S2)){
function(S1,S2);
}
else function(S2,S1);
if (z==1)
printf("true");
else printf("false");
return 0;
}
注意:
代码能通过样例测试,但不能提交成功。如果你有更好的方法,可以一起讨论下。如果哪里有错误,欢迎指出。