题目:
字符串轮转。给定两个字符串s1
和s2
,请编写代码检查s2
是否为s1
旋转而成(比如,waterbottle
是erbottlewat
旋转后的字符串)。
注意:这里是轮转,不是翻转,字符串只是将一部分子串转移到了原字符串的后面
输入:s1 = "waterbottle", s2 = "erbottlewat"
输出:True
解题思路:
方法一:找关系
1.首先,如果两个字符串不相等,那么一定不是轮转的
2.如果s2是s1的轮转,那么s2[j]=s1[(i+j)%n],其中i就表示,从下标为i的元素后开始轮转的,
所以只需要固定i,每个i都遍历一遍s2,如果s2的每个字符都满足s2[j]=s1[(i+j)%n],则说明是轮转的,如果所有的i都试了一遍,发现s2的字符都不能满足,则说明不是轮转的
源代码如下:
cpp
class Solution {
public:
bool isFlipedString(string s1, string s2) {
int n=s1.size();
int m=s2.size();
if(n!=m) return false;
if(m==0) return true;
for(int i=0;i<n;i++)
{
bool flag=true;
for(int j=0;j<m;j++)
{
if(s1[(i+j)%n]!=s2[j])
{
flag=false;
break;
}
}
//s2遍历完了,flag依旧为true,说明s2中每个字符都满足,所以已经找到了轮转的位置,直接返回true
if(flag)
{
return true;
}
}
return false;
}
};
方法二:搜索子字符串
如果s2是s1轮转过来的,那么在s1+s1这个字符串中一定可以完整的找到s2
源代码如下:
cpp
class Solution {
public:
bool isFlipedString(string s1, string s2) {
//find()返回值为-1时,说明在字符串中找不到s2
return s1.size()==s2.size()&&(s1+s1).find(s2)!=-1;
}
};