计蒜客 信息学题库 T1117 字符串移位包含问题

T1117 字符串移位包含问题

对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。

给定两个字符串 s1和 s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA是由AABCD两次移位后产生的新串BCDAA的子串,而ABCDACBD则不能通过多次移位来得到其中一个字符串是新串的子串。

输入格式
一行,包含两个字符串,中间由单个空格隔开。字符串只包含字母和数字,长度不超过 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;
} 

注意:

代码能通过样例测试,但不能提交成功。如果你有更好的方法,可以一起讨论下。如果哪里有错误,欢迎指出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值