题目描述
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。
例如CDAA是由AABCD两次移位后产生的新串BCDAA的子串,而ABCD与ACBD则不能通过多次移位来得到其中一个字符串是新串的子串。
算法
假定a,b两个字符串中,较长的为a,如果不满足,进行交换;如果a和b长度相同,那么当满足题设时,这两个字符串互相满足条件。
将2个a拼接构成新的a,在a中查找b,只要能够匹配到即满足题目要求。
补充说明:
对于s1和s2两个字符串,在短串中一定不能找到长串,因此将在长串中寻找短串(包括长度相等)是否能够满足条件,交换串的目的正是满足这一约束。
在长串中寻找短串时,可以将长串看做首尾相接的环。
能够找到短串应只有两种情况:1.不需要移位,短串在长串中;2.短串前一部分在长串尾,剩余部分在长串头。
那么可以将两个长串顺序拼接,构成双倍长串。
当满足题目要求时,对于情况1,一定能找到,还能找到两个;对于情况2,因为短串短于长串,因此短串的前一部分和后一部分一定都短于长串,一定能在尾首拼接的双倍长串中找到短串。
C++ 代码
#include <iostream>
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
if(b.size()>a.size()) swap(a,b);
a+=a;
if(a.find(b)!=-1) cout<<"true";
else cout<<"false";
return 0;
}
本人萌新....
对于s1和s2两个字符串,在短串中一定不能找到长串,因此将在长串中寻找短串(包括长度相等)是否能够满足条件,交换串的目的正是满足这一约束。
在长串中寻找短串时,可以将长串看做首尾相接的环。
能够找到短串应只有两种情况:1.不需要移位,短串在长串中;2.短串前一部分在长串尾,剩余部分在长串头。
那么可以将两个长串顺序拼接,构成双倍长串。
当满足题目要求时,对于情况1,一定能找到,还能找到两个;对于情况2,因为短串短于长串,因此短串的前一部分和后一部分一定都短于长串,一定能在尾首拼接的双倍长串中找到短串。
orz!!是我的理解出了问题,谢谢大佬!!
b不可能刚好是a的子串,不是需要移位吗,你这样不就是把a字符串叠加了一次,也应该需要移位才能得到完整的b字符串
总感觉不对,但它就是对了
大佬 强啊
这个题目比较巧哈哈~