题目描述
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串s1和s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。
例如CDAA是由AABCD两次移位后产生的新串BCDAA的子串,而ABCD与ACBD则不能通过多次移位来得到其中一个字符串是新串的子串。
样例
AABCD CDAA
输出样例:
true
其中字符串的查找操作可以灵活使用库函数,详细用法欢迎大家看看我总结的常用字符串操作
C++ 代码
#include <iostream>
#include <cstring>
using namespace std;
int main(){
string str1,str2;
cin >> str1 >> str2;
//确保str1存储较长字符串,即只会出现str1包含str2的情况
if(str1.size()<str2.size()) swap(str1,str2);
//情况一: 直接包含
if(str1.find(str2)!=-1){
cout << "true" ;
return 0;
}
//情况二: 模式串分割成两段,前半串在主串末尾,后半段在主串开头
for(int i=0;i<str2.size();i++){
//str1.find(string str2, int n) 从第n位的字符串str1开始寻找字符串str2
if(str1.find(str2.substr(i))==0&&str1.find(str2.substr(0,i),str1.size()-i-1)==str1.size()-i){
cout << "true" ;
return 0;
}
}
cout << "false";
return 0;
}
总结tql