题目描述
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。
例如 CDAA 是由 AABCD 两次移位后产生的新串 BCDAA 的子串,而 ABCD 与 ACBD 则不能通过多次移位来得到其中一个字符串是新串的子串。
感受
移位问题可以通过三个反转解决
reverse函数在修改字符串时,会直接修改,不会产生临时string对象,需要注意在每一次循环结束后,要将s1设置为初始状态,可以再次声明一个string对象,作为临时变量,用于存储s1的初始状态
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string s1,s2,s3;
cin>>s1>>s2;
if(s1.size()<s2.size()){
string temp=s1;
s1=s2;
s2=temp;
}
reverse(s1.begin(),s1.end());
s3=s1;
for(int i=0;i<s1.size();i++){
reverse(s1.begin(),s1.begin()+i);
reverse(s1.begin()+i,s1.end());
for(int j=0;s1[j+s2.size()-1]!='\0';j++){
if(s1.substr(j,s2.size())==s2){
cout<<"true";
return 0;
}
}
s1=s3;
}
cout<<"false";
return 0;
}