对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。🤔
给定两个字符串 s1s1 和 s2s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。
例如 CDAA 是由 AABCD 两次移位后产生的新串 BCDAA 的子串,而 ABCD 与 ACBD 则不能通过多次移位来得到其中一个字符串是新串的子串。
输入格式
共一行,包含两个字符串,中间由单个空格隔开。
字符串只包含字母和数字,长度不超过 3030。
输出格式
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出 true,否则输出 false。
输入样例:
AABCD CDAA
输出样例:
true
#include <algorithm>
#include <iostream>
using namespace std;
int main() {
string a, b;
cin >> a >> b;
if (a.size() < b.size()) swap(a, b);//若a字符串小于b 交换
for (int i = 0; i < a.size(); i++)
{
a = a.substr(1) + a[0];//将字符后移 第一次将AABCD 移动为ABCDA
for (int j = 0; j + b.size() <= a.size(); j++)
{
int k=0;
for ( ; k < b.size(); k++)
if (a[j + k] != b[k])
break;//不相等提前终止循环
if (k == b.size())
{
puts("true");
return 0;
}
}
}
puts("false");
return 0;
}
观摩了一下大佬的。😔
#include <algorithm>
#include <iostream>
using namespace std;
int main(){
string a,b,c;
cin>>a>>b;
if(a.size() < b.size()) swap(a,b);
a+=a;
size_t t =a.find(b);
if(t != string::npos)puts("true");
else puts("false");
return 0;
}