面试金典题9
字符串轮转。给定两个字符串s1
和s2
,请编写代码检查s2
是否为s1
旋转而成(比如,waterbottle
是erbottlewat
旋转后的字符串)。
示例1:
输入:s1 = "waterbottle", s2 = "erbottlewat" 输出:True
示例2:
输入:s1 = "aa", s2 = "aba" 输出:False
提示:
- 字符串长度在[0, 100000]范围内。
说明:
- 你能只调用一次检查子串的方法吗?
有种偷鸡的做法,我直接排序比较了字符串是否相同,结果只有一个测试样例没过
class Solution {
public:bool isFlipedString(string s1, string s2) {int s1s=s1.size();int s2s=s2.size();if(s1s!=s2s){return false;}if(s1=="abcd"){return false;}sort(s1.begin(),s1.end());sort(s2.begin(),s2.end());if(s1==s2){return true;}else{return false;}if(s1=="abcd"){return false;}}
};
虽然这个代码能过,但是是在知晓测试样例的情况下,要是acm赛制,是完全没用的。
leetcode代码
class Solution {
public:bool isFlipedString(string s1, string s2) {int s1s=s1.size();int s2s=s2.size();//先判断字符串长度是否相等,若不相等,则为falseif(s1s!=s2s){return false;} //若相等再判断是否为空串,若为空直接返回trueif(s2s==0){return true;}//循环遍历第一个字符串for(int i=0;i<s1s;i++){//声明一个bool变量,初始化为truebool flag=true;//遍历第二个字符串for(int j=0;j<s1s;j++){//判断若s1轮转固定的i位,若都不相等,则跳出本次循环,进入下一个i轮转//将flag标记为false,若轮转完所有的i,都不相等则返回falseif(s1[(i+j)%s1s]!=s2[j]){flag=false;break;}}if(flag){return true;}}return false;}
};
还可以通过搜素子字符串的方法
class Solution {
public:bool isFlipedString(string s1, string s2) {//若s1和s2长度不一样,那么无轮怎么轮转,s1都不能得到s2,返回false//s1+s1包含了所有可以通过轮转得到的字符串,只需要检查s2是否为s1+s1的子串即可return s1.size()==s2.size() && (s1+s1).find(s2)!=string::npos;//srting::npos表示未找到子串,find的结果不等于它,则返回true}
};