代码随想录-032-剑指Offer58-II.左旋转字符串

前言

在本科毕设结束后,我开始刷卡哥的“代码随想录”,每天一节。自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。
代码随想录此题链接

题目

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

示例 1:

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

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

限制:

1 <= k < s.length <= 10000

进阶:请尝试使用 O(1) 额外空间复杂度的 原地 解法。

1. 先整体翻转再局部反转的(额外空间复杂度为O(1)的原地解法)

思路(定义变量)

2. 本题思路分析:

  1. 共两步。假设整个string对象为s,长度为s.size()。
  • 第一步:将整个字符串全部翻转。
  • 第二步:分别将str.size()-n为分界线,将前后两个子字符串分别翻转。

3. 算法实现

  • 代码:
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
string reverseLeftWords(string s, int n) {
	//整体翻转  
    reverse(s.begin(),s.end());
    //局部翻转  
    reverse(s.begin(),s.begin() + s.size() - n);
    reverse(s.begin() + s.size() - n,s.end());
    return s;
}

4. 算法复杂度

  1. 时间复杂度:O(n)
  2. 空间复杂度:O(1)

5. 算法坑点

  1. 如果一个数组有8位,倒数第2个数要换算成正数的位数,那么则是8-2+1=7,正数第7个数。

  2. 这个思路很巧妙,不好想到,最开始的想法就是借助额外的一个string拼接字符串。代码如下:

string reverseLeftWords(string s, int n) {
        string result;
        for(int i = n;i < s.size();i++){
            result += s[i];
        }
        for(int i = 0;i < n;i++){
            result += s[i];
        }
        return result;
    }

版权声明:本文为weixin_43356308原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。