LeetCode 每日一题——面试题 01.09. 字符串轮转

111 阅读2分钟

1.题目描述

面试题 01.09. 字符串轮转

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

示例1:

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

示例2:

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

 

2.解题思路与代码

2.1 解题思路

首先判断两个字符串长度是否相同,如果不同两个字符串无论哪个旋转都不会变成另一个,直接返回false。如果相同这个时候将 s1 扩成两倍 s,即 s =s1+s1,然后在 s 上寻找字符串 s2,如果能匹配到 s2 那么 s2 必然是由 s1 旋转而成。因为拆分 s1 后的两个字符串会变成首尾相连,因此通过扩展 s1 然后匹配 s2 即可。匹配 s2 的过程可以直接调用 String 的 contains 方法,即

String s = s1 + s1;
return s.contains(s2);

也可以自己完成匹配过程,使用 s1 在字符串 s 上滑动,以 s2 长度为窗口,每滑动一次都在窗口内比较该窗口和字符串 s2 是否相同,如果相同,则返回 true,如果不同,就继续滑动该窗口比较下一组。

2.2 代码

使用 jdk 匹配

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

    }
}

不使用 jdk 匹配

class Solution {
    public boolean isFlipedString(String s1, String s2) {
        if (s1.length() != s2.length()) {
            return false;
        }
        if ("".equals(s1) && "".equals(s2)) {
            return true;
        }
        String s = s1 + s1;
        int index = 0;
        outer:
        while (index < s.length() - s2.length()) {
            int idx = index;
            int idx2 = 0;
            while (idx2 < s2.length()) {
            if (s.charAt(idx) != s2.charAt(idx2)) {
                index = idx + 1;
                continue outer;
            } else {
                idx++;
                idx2++;
            }
            }
            return true;
        }
        return false;
    }
}

2.3 测试结果

通过测试

使用 jdk 匹配

image.png

不使用 jdk 匹配

image.png

3.总结

  • 将 s1 字符串扩展一倍,然后再扩展后的字符串上匹配 s2