「这是我参与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 <= 100s和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)