题目描述
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。
例如CDAA是由AABCD两次移位后产生的新串BCDAA的子串,而ABCD与ACBD则不能通过多次移位来得到其中一个字符串是新串的子串。
思路
1.先让a字符串为长度较长的字符串
2.先判断b是否为a不移位时的子串
3.从i = a.size() - b.size() + 1开始,判断i每移动一位的a的长为b.size()的子串是否与b相等
代码
#include <iostream>
using namespace std;
int main ()
{
string a, b;
cin >> a >> b;
string c;
if (a.size() < b.size())
{
c = a;
a = b;
b = c;
} //交换位置,使a为较长的字符串
for(int i = 0; i <= a.size() - b.size(); i ++ )
{
if(a.substr(i, b.size()) == b)//判断b是否为a不移位时的子串
{
cout << "true" << endl;
return 0;
}
}
string r;
for(int i = a.size() - b.size() + 1; i < a.size(); i ++ )
{
r = a.substr(i) + a.substr(0, i - a.size() + b.size());
//从i = a.size() - b.size() + 1开始,做一个长度为b.size()的移位a子串
if(r == b) //判断移位子串是否与b相等
{
cout << "true" << endl;
return 0;
}
}
cout << "false" << endl;
return 0;
}