[LeetCode]面试题 01.09. 字符串轮转

题目描述

难度 简单

字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。

示例1:

 输入:s1 = "waterbottle", s2 = "erbottlewat"
 输出:True

示例2:

 输入:s1 = "aa", s2 = "aba"
 输出:False

提示:

    字符串长度在[0, 100000]范围内。

说明:

    你能只调用一次检查子串的方法吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-rotation-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


思路

解法一:%运算符具有轮转性质,穷举比对拼接的字符与s2是否相等,时间复杂度O(N^2+M)。

解法二:巧妙的思路,判断s2+s2是否包含s1。因为s1不管如何轮转都可以在s2+s2组合的串内中找到,假如s1在s2+s2组合串范围内找不到,则表示s1是错误的字符串。

代码实现

解法一:

class Solution {
    public boolean isFlipedString(String s1, String s2) {
        if (s1.length() > 100000 || s2.length() > 100000 || s1.length() != s2.length())
            return false;
        if (s1.equals("") && s2.equals(""))
            return true;

        char[] s1chars = s1.toCharArray();

        //轮转拼接s1chars子串,检查是否与s2相等
        //%运算符具有轮转性质
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < s1chars.length; i++) {//最大轮转次数


            int index = 0;
            while (index < s1chars.length) {
                stringBuilder.append(s1chars[(index + i) % s1chars.length]);
                index++;
            }
            if (stringBuilder.toString().equals(s2))
                return true;
            stringBuilder.delete(0, s1chars.length);
        }

        return false;
    }
}

执行结果:通过
执行用时:903 ms, 在所有 Java 提交中击败了5.14% 的用户
内存消耗:39 MB, 在所有 Java 提交中击败了5.19% 的用户
通过测试用例:30 / 30
2021年 11月 14日 星期日 05:31:26 CST[LeetCode]面试题 01.09. 字符串轮转

解法二:

class Solution {
    public boolean isFlipedString(String s1, String s2) {
        if (s1.length() > 100000 || s2.length() > 100000 || s1.length() != s2.length())
            return false;
        return (s2 + s2).contains(s1);
    }
}

执行结果:通过
执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
内存消耗:37.8 MB, 在所有 Java 提交中击败了95.49% 的用户
通过测试用例:30 / 30
2021年 11月 14日 星期日 05:47:35 CST[LeetCode]面试题 01.09. 字符串轮转

上一篇:2021-11-14剑指OfferII014.字符串中的变位词


下一篇:回文字符串问题