题目:
面试题 01.09. 字符串轮转.
字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。
链接:https://leetcode-cn.com/problems/string-rotation-lcci/
示例:
输入:s1 = “waterbottle”, s2 = “erbottlewat”
输出:True
输入:s1 = “aa”, s2 = “aba”
输出:False
提示:字符串长度在[0, 100000]范围内。
说明:你能只调用一次检查子串的方法吗?
思路:
最开始的想法:
借助python中的字典数据类型。遍历字符串,每次旋转一个字符,存入字典中。所有字符遍历结束后, 在字典中查找字符串s2,返回查找结果。
结果超时了。
后来看了提示:
如果一个字符串是另一个字符串的旋转,那么它就是在某个特定点上的旋转。例如,字符串waterbottle在3处的旋转意味着在第三个字符处切割waterbottle,并在左半部分(wat)之前放置右半部分(erbottle)。
于是,按照上述思路,先找到两个字符串的公共子串,再分别用两个字符串减去公共子串,判断余下子串是否即可。
代码:
class Solution:
def isFlipedString(self, s1: str, s2: str) -> bool:
if len(s1) != len(s2): return False
j = 0
for i in range(len(s1)):
if s1[i] == s2[j]:
j += 1
return s1[: len(s2) - j] == s2[j:]
时间复杂度O(n),空间复杂度O(1).