题目
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串 s_1s1 和 s_2s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA
是由AABCD
两次移位后产生的新串BCDAA
的子串,而ABCD
与ACBD
则不能通过多次移位来得到其中一个字符串是新串的子串。
输入
一行,包含两个字符串,中间由单个空格隔开。字符串只包含字母和数字,长度不超过 3030。
输出
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出true
,否则输出false
。
样例
输入
AABCD CDAA
输出
true
看到题目,我就蒙了
先输入吧,还有求出两个字符串的长度
string s,t;
cin >> s >> t;
if(s.length() > t.length())
{
swap(s, t);
}
int lens = s.length();
int lent = t.length();
先输入了,再构思:
既然要判断对错,就设个flag,初始为true。然后,再循环,这时候就可以进行判断了,如果
s[k] != t[(i + k) % lent]
就说明可以产生子串了,flag变成false。
之后,开始遍历并进行判断:
for(int i = 0;i < t.length(); i++)
{
bool flag = true;
for(int k = 0; k < lens; k++)
{
if(s[k] != t[(i + k) % lent])
{
flag = false;
}
}
if(flag == true)
{
cout<< "true";
return 0;
}
}
cout<< "false";
完整代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s,t;
cin >> s >> t;
if(s.length() > t.length())
{
swap(s, t);
}
int lens = s.length();
int lent = t.length();
for(int i = 0;i < t.length(); i++)
{
bool flag = true;
for(int k = 0; k < lens; k++)
{
if(s[k] != t[(i + k) % lent])
{
flag = false;
}
}
if(flag == true)
{
cout<< "true";
return 0;
}
}
cout<< "false";
return 0;
}