【题目描述】
字符串移位包含问题。
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA
是由AABCD
两次移位后产生的新串BCDAA
的子串,而ABCD
与ACBD
则不能通过多次移位来得到其中一个字符串是新串的子串。
【输入】
一行,包含两个字符串,中间由单个空格隔开。字符串只包含字母和数字,长度不超过3030。
【输出】
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出true
,否则输出false
。
【输入样例】
AABCD CDAA
【输出样例】
true
思路:
循环位移就是将字符串第一个元素移到末尾,不考虑本身们会移动总个数-1次,这里我们用到STL容器中的string,保存好要移动的元素,之后删除,再添加到末尾,嵌套到循环里面,因为我们要用长串查短串所以要保证s1最长。
#include<iostream>
#include<string>
using namespace std;
int main() {
string s1, s2;
cin >> s1 >> s2;
//保证s1是长串,用长串查短串,因为我们不知道哪个长哪个短。
if (s1.length() < s2.length()) {
swap(s1, s2);
}
for (int i = 0; i < s1.size(); i++) {
if (s1.find(s2) != -1) {
cout << "true" << endl;
return 0;
}
char t = s1[0];//保存好第一个元素
s1.erase(0, 1);//从下标为0的地方开始删除,删除1个
s1 += t; //将保存好的元素加到最后
}
cout << "false";
}