【LeetCode】字符串轮转Java初学者题解

87 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

题目描述

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

示例1:

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

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

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

思路分析

  • 今天的算法题目是判断两个字符串s1和s2, s2是否为s1旋转而成。这里旋转的意思是,将字符串s1的每一个字符从前到后逐个移动到末尾形成新的字符串。
  • 比较字符串s2是否为s1旋转而成。首先需要比较的s1, s2 字符串的长度,当他们的长度不相同的时候,必然是 false。
  • 当s1, s2 字符串的长度相同的时候。怎么完成 s1 的旋转呢? 直接把 s1 的字符逐个移动到尾部实现起来比较复杂!这里有一个小技巧,我们可以把两个 s1 拼接起来形成 s3, 然后使用 substring() 函数,就可以直接完成旋转的需求。
  • 完成了 s1 的旋转,接下来需要和 s2 比较是否相同。我们直接使用 equals() 方法即可, 初学的朋友不要使用 == 比较。 equals() 比较是对象的内容是否相同。== 对于基本的数据类型,比较的是值是否相同。对于对象,比较的是地址是否相同。
  • 具体实现代码如下,供参考。

通过代码

class Solution {
    public boolean isFlipedString(String s1, String s2) {
        boolean ans = false;
        if (s1.length() != s2.length()) {
            return ans;
        }
        if (s2.equals(s1)) {
            ans = true;
            return ans;
        }
        int n = s1.length();
        String s3 = s1 + s1;
        for (int i = 0; i < n; i++) {
            String temp = s3.substring(i, i + n);
            if (s2.equals(temp)) {
                ans = true;
                return true;
            }
        }

        return ans;
    }
}

总结

  • 上述算法的时间复杂度是O(n), 空间复杂度是O(n)
  • 坚持算法每日一题,加油!