刷题打卡——字符串轮转

356 阅读2分钟

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);
    }
}

总结

这题不难,告诉我们一个道理,解决问题的方法有很多,换个角度看问题也许就能更简单些。