题目描述
给出字符串A和B,判断A是否是B的进行循环移位得到的子串。
如A = “ABC”,B = “BCDEFA”, 则是。
输入输出格式
输入描述:多组输入
输入两个字符串A和B
输出描述:如果是循环移位子串输出yes,否则输出no
如:
ABC BCDEFA---------yes
ABC BADEFC---------no
解题思路:一
复制B字符串B+B,利用find(),在B+B中直接找A
#include <iostream>
#include <cstring>
using namespace std;
int main(){
string a,b;
while(cin>>a>>b){
string ans = b+b;
if(ans.find(a)!=-1) cout<<"yes";//find==-1代表没找到
else cout<<"no";
cout<<endl;
}
return 0;
}
解题思路:二
B+=B然后暴力匹配
#include <iostream>
#include <string>
using namespace std;
void isOk(string a,string b){
int j=0;
bool flag=false;
for(int i=0;i<b.length();++i){
for(;j<a.length();++j){
if(a[j]!=b[i+j])break;
}
if(j==a.length()){
cout<<"yes"<<endl;
flag=true;
break;
}
else j=0;
}
if(!flag)cout<<"no"<<endl;
}
int main(){
string a,b;
while(cin>>a>>b){
b+=b;
isOk(a,b);
}
return 0;
}
解题思路:三
从头比较0到len1是否为a
不是的话循环一个字符
#include <iostream>
#include <string>
using namespace std;
void isOk(string a,string b){
int len1=a.length();
int len2=b.length();
bool flag=false;
for(int i=0;i<len2;++i){
if(b.substr(0,len1)==a){//b的0到len1长度的子串
flag=true;
cout<<"yes"<<endl;
break;
}
else{
char temp=b.back();//取b最后一个元素
b.pop_back();//删除最后一个元素
b=temp+b;
}
}
if(!flag)cout<<"no"<<endl;
}
int main(){
string a,b;
while(cin>>a>>b){
isOk(a,b);
}
return 0;
}