【LeetCode刷题记录】16.字符串轮转

116 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode-字符串轮转

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

示例1:

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

输出:True

示例2:

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

输出:False

提示:

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

说明:

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

二、思路分析:

思路一:

  1. 判断两个字符串长度是否相等,不相等返回false
  2. 将第二个字符串拼接两次,如果是由第一个字符串旋转而成的,则拼接后的字符串一定会包含第一个字符串

思路二:

  1. 如果s2为字符串s1旋转所得,那么从s1的0下标开始,每次加入s1的下一位字符,一开始肯定是s2的字串
  2. 当达到一定程度时, 一定会出现不是s2字串的情况, 那么这个就是旋转点 当 i = 0 时 substringOfS1 = "w" 为 s2 = "erbottlewat" 的字串, s2.indexOf(substringOfS1) != -1

当 i = 1 时 substringOfS1 = "wa" 为 s2 = "erbottlewat" 的字串, s2.indexOf(substringOfS1) != -1

当 i = 2 时 substringOfS1 = "wat" 为 s2 = "erbottlewat" 的字串, s2.indexOf(substringOfS1) != -1

当 i = 3 时 substringOfS1 = "wate" 为 s2 = "erbottlewat" 的字串, s2.indexOf(substringOfS1) == -1

此时,i=3则为旋转点,wat是旋转后的部分,把wat和剩余的部分erbottle反过来拼接即可得到erbottlewat

三、AC 代码:

思路一:

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

思路二:

    class Solution {
        public boolean isFlipedString(String s1, String s2) {
            if (s1 == null && s2 == null) {
                return true;
            }
            if (s1 == null || s2 == null) {
                return false;
            }
            if (s1.equals(s2)) {
                return true;
            }
            int lengthOfS1 = s1.length();
            int lengthOfS2
                    = s2.length();
            if (lengthOfS1 != lengthOfS2) {
                return false;
            }
            int i = 0;
            while (s2.indexOf(s1.substring(0, i + 1)) != -1) {
                i++;
            }
            StringBuilder sb = new StringBuilder();
            sb.append(s1, i, lengthOfS1);
            sb.append(s1, 0, i);
            return sb.toString().equals(s2);
        }
    }