LeetCode.796 旋转字符串

159 阅读2分钟

「这是我参与2022首次更文挑战的第39天,活动详情查看:2022首次更文挑战」。

题目描述:

796. 旋转字符串 - 力扣(LeetCode) (leetcode-cn.com)

给定两个字符串, s 和 goal。如果在若干次旋转操作之后,s 能变成 goal ,那么返回 true 。

s 的 旋转操作 就是将 s 最左边的字符移动到最右边。 

例如, 若 s = 'abcde',在旋转一次之后结果就是'bcdea' 。

示例一

输入: s = "abcde", goal = "cdeab"
输出: true

示例二

输入: s = "abcde", goal = "abced"
输出: false

提示:

  • 1 <= s.length, goal.length <= 100
  • s 和 goal 由小写英文字母组成

思路分析

判断子串

其实题目换个角度说,所谓的旋转就是将一个字符串从某一个位置,将这个位置之前的字母放到原本字符串的最后面。

所有我们假设原本的字符串为A的话,那么 A+A 就包含了A旋转之后的所有可能性。

所以我们只要简单的判断 A+A 是否包含B,同时加一个长度的判断即可。

AC代码

class Solution {
    fun rotateString(s: String, goal: String): Boolean {
        return s.length == goal.length && (s+s).contains(goal)

    }
}

KMP算法

由上面的解法优化而来,既然涉及到字符串字串问题,我们在之前的LeetCode.28 实现 strStr()中已经详细的说过了KMP算法,这里就不再赘述了。

KMP的经典思想就是:当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。

总结

虽然是简单题,但是他涉及到的KMP以及Rabin-Karp 字符串哈希法都是经典的解法,我们需要熟练运用。

参考

旋转字符串 - 旋转字符串 - 力扣(LeetCode) (leetcode-cn.com)

KMP 算法详解 - 实现 strStr() - 力扣(LeetCode) (leetcode-cn.com)

旋转字符串 - 旋转字符串 - 力扣(LeetCode) (leetcode-cn.com)