剑指offer43_左旋转字符串_题解

左旋转字符串

题目描述

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!

示例1

输入

"abcXYZdef",3

返回值

"XYZdefabc"

分析

方案一:字符串切片拼接

获取字符串 s[n:] 切片和 s[:n] 切片,使用 "+" 运算符拼接并返回即可。

代码

/**
1.时间复杂度:O(N)
其中N为字符串s的长度,字符串切片函数为线性时间复杂度
2.空间复杂度:O(N)
两个字符串切片的总长度为N
**/
class Solution
{
public:
    string LeftRotateString(string s, int n)
    {
        int len = s.length();
        if (n > len)
            n %= len;
        string ret = s.substr(n, len) + s.substr(0, n);
        return ret;
    }
};

方案二:局部反转+整体反转

  1. 反转区间为前n的子串
  2. 反转区间为n到末尾的子串
  3. 反转整个字符串

代码

/**
1.时间复杂度:O(n)
2.空间复杂度:O(1)
**/
class Solution{
public:
	string LeftRotateString(string s, int n){
		int len = s.length();
		if(n > len)
			n %= len;
		reverse(s.begin(), s.begin() + n);
		reverse(s.begin() + n, s.end());
		reverse(s.begin(), s.end());
		return s;
	}
};
posted @ 2021-01-16 20:54  RiverCold  阅读(77)  评论(0编辑  收藏  举报