题目

Rotate String

题解

对于字符串s,我们可以在旋转点上把字符串s切割成x和y左右两部分,那么对s的旋转就等价于将xy转换为yx。如果将两个s拼接在一起,那么所有可能出现的旋转结果都会被包含在ss中,因为不管怎么进行切割,yx也一定会被xyxy包含。也就是说,字符串goal是ss的子串,是原题目为True的必要条件。

反过来看,如果字符串goal是ss的子串,那么我们可以找出与某一个旋转相对应的x和y(将匹配的部分从ss中间去掉,左边的即为x,右边的即为y),使得s经过该旋转后变成goal。也就是说,字符串goal是ss的子串,是原题目为True的充分条件。

综上所述,字符串goal是ss的子串,就是原题目为True的充分必要条件(在goal与s长度相等这个明显的前提下),我们只需进行这个检查即可。

代码

class Solution:
    def rotateString(self, s: str, goal: str) -> bool:
        return len(s) == len(goal) and goal in s + s