问题

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

示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab”

示例 2:
输入: s = “lrloseumgh”, k = 6
输出: “umghlrlose”

方法一:字符串切片

获取字符串 Offer-58-Ⅱ:左旋转字符串 - 图1 切片和Offer-58-Ⅱ:左旋转字符串 - 图2 切片,使用 “+” 运算符拼接并返回即可

  1. class Solution {
  2. public String reverseLeftWords(String s, int n) {
  3. return s.substring(n, s.length()) + s.substring(0, n);
  4. }
  5. }
  • 时间复杂度 Offer-58-Ⅱ:左旋转字符串 - 图3 : 其中 N 为字符串 s 的长度,字符串切片函数为线性时间复杂度
  • 空间复杂度 Offer-58-Ⅱ:左旋转字符串 - 图4 : 两个字符串切片的总长度为 N

方法二:列表遍历拼接

  • 新建一个 StringBuilder,记为 res
  • 先向 res添加 “第 n + 1 位至末位的字符”
  • 再向 res添加 “首位至第 n 位的字符”
  • res转化为字符串并返回

    1. class Solution {
    2. public String reverseLeftWords(String s, int n) {
    3. StringBuilder res = new StringBuilder();
    4. for(int i = n; i < s.length(); i++)
    5. res.append(s.charAt(i));
    6. for(int i = 0; i < n; i++)
    7. res.append(s.charAt(i));
    8. return res.toString();
    9. //return new String(res);
    10. }
    11. }
  • 时间复杂度 Offer-58-Ⅱ:左旋转字符串 - 图5 : 线性遍历 s 并添加,使用线性时间

  • 空间复杂度 Offer-58-Ⅱ:左旋转字符串 - 图6 : 新建的辅助 res 使用 Offer-58-Ⅱ:左旋转字符串 - 图7 大小的额外空间

方法三:字符串遍历拼接

  1. class Solution {
  2. public String reverseLeftWords(String s, int n) {
  3. String res = "";
  4. for(int i = n; i < s.length(); i++)
  5. res += s.charAt(i);
  6. for(int i = 0; i < n; i++)
  7. res += s.charAt(i);
  8. return res;
  9. }
  10. }
  • 时间复杂度 Offer-58-Ⅱ:左旋转字符串 - 图8 : 线性遍历 s 并添加,使用线性时间
  • 空间复杂度 Offer-58-Ⅱ:左旋转字符串 - 图9 : 新建的辅助 res 使用 Offer-58-Ⅱ:左旋转字符串 - 图10 大小的额外空间