Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。
示例1:
输入:s1 = "waterbottle", s2 = "erbottlewat"
输出:True
示例2:
输入:s1 = "aa", s2 = "aba"
输出:False
提示:
字符串长度在[0, 100000]范围内。 说明:
你能只调用一次检查子串的方法吗?
二、思路分析:
这道题我第一思路是遍历s1字符串,把s1字符串从前面取走一个字符依次加入到字符串后面,然后再和字符串s2作比较,这样是最简单最暴力的做法。
先判断长度是否相等,不相等就直接返回false。
使用String.substring()截取字符。
class Solution {
public boolean isFlipedString(String s1, String s2) {
if(s1.length() != s2.length()) return false;
if(s1.equals(s2)) return true;
for(int i=0; i<s1.length(); i++)
if((s1.substring(i,s1.length())+s1.substring(0,i)).equals(s2))
return true;
return false;
}
}
然后我一看执行结果:
执行结果:通过
执行用时:21 ms, 在所有 Java 提交中击败了8.78%的用户
内存消耗:42 MB, 在所有 Java 提交中击败了4.99%的用户
这居然用了21ms,只击败了8%的用户,于是我打开评论区,查看大家的解法,好家伙,当我看到一个解法后直呼厉害。
直接 s2拼接两次,然后判断s2是否包含字符串s1。
为什么呢?这里我们来分析一下:
比如s1 = abcd , s2=cdab ,那么s2+s2 = cdabcdab , 一定包含了abcd,当然也可以s1 + s1,判断s2是否包含在其中。
然后contains()方法调用的就是indexOf()方法。
三、AC 代码:
class Solution {
public boolean isFlipedString(String s1, String s2) {
if(s1.length() != s2.length()) return false;
if(s1.equals(s2)) return true;
s2 = s2+s2;
return s2.contains(s1);
}
}
总结
这题不难,告诉我们一个道理,解决问题的方法有很多,换个角度看问题也许就能更简单些。