剑指 Offer 58 - II. 左旋转字符串

剑指 Offer 58 - II. 左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

示例 1:


输入: s = "abcdefg", k = 2

输出: "cdefgab"

示例 2:


输入: s = "lrloseumgh", k = 6

输出: "umghlrlose"

限制:

  • 1 <= k < s.length <= 10000

来源:力扣(LeetCode)

链接:力扣

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

一解

将字符串拆分后进行拼接,但一般不允许此方法!:


class Solution:

    def reverseLeftWords(self, s: str, n: int) -> str:

        return s[n:] + s[:n]

  • 时间复杂度 O(n):字符串切片函数为线性时间复杂度(参考资料)。

  • 空间复杂度 O(n):两个字符串切片的总长度为 N 。

二解

手动拼接字符串:

  • 声明数组 res 。

  • 向 res 追加 n~结尾的字符。

  • 向 res 追加 0~n 的字符。


class Solution:

    def reverseLeftWords(self, s: str, n: int) -> str:

        res = []

        for i in range(n, len(s)):

            res.append(s[i])

        for i in range(n):

            res.append(s[i])

        return "".join(res)

  • 时间复杂度 O(n)。

  • 空间复杂度 O(n)。

三解

与二解思路相同,可使用求余运算简化代码:


class Solution:

    def reverseLeftWords(self, s: str, n: int) -> str:

        res = []

        for i in range(n, len(s) + n):

            res.append(s[i%len(s)])

        return "".join(res)

  • 时间复杂度 O(n)。

  • 空间复杂度 O(n)。

四解

若规定不能使用 join 操作,可使用字符串替代列表:


class Solution:

    def reverseLeftWords(self, s: str, n: int) -> str:

        res = ""

        for i in range(n, len(s) + n):

            res  += s[i%len(s)]

        return res