刷题的日常-字符串轮转

55 阅读2分钟

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

刷题的日常-2022年9月29日

一天一题,保持脑子清爽

字符串轮转

来自leetcode的 面试题 01.09 题,题意如下:

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

示例一:

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

示例二

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

理解题意

我们可以从题意中提取的条件如下:

  • 题目给出两个字符串
  • 要求我们判断字符串是不是旋转后的字符串
  • 旋转字符串是源字符串往后一直走,最后的字符拼接到前面

做题思路

这里我们可以有两种方法来做判断:暴力,字符串拼接

暴力搜寻

我们可以先判断两个字符串的长度是否一致,如果一致则直接返回false。如果长度一致,我们就需要遍历字符串,找出相同的位置,然后根据长度往后判断对应的字符是否相等,需要注意的是越界的情况需要对索引进行取模。这种方法的时间复杂度是O(n^2)

字符串拼接

字符串s1在某个地方进行了旋转得到s2,我们可以知道,旋转后的s2拼接两次一定可以有包含s1,如用例1所示,"erbottlewat"拼接两次可以得到"erbottlewaterbottlewat",中间就包括了原始的字符串"waterbottle",所以,我们只需要判断拼接后的字符串是否包换原始字符串就行,步骤如下:

  • 判断两个字符串是否相同,如果不同就返回false
  • 将翻转后的字符串相加
  • 判断相加后的字符串是否包含原始字符串
  • 返回判断结果

代码实现

代码实现如下:

public class Solution {

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

}

image.png