首页 > 技术文章 > [剑指Offer] 43.左旋转字符串

lca1826 2017-03-09 12:56 原文

题目描述

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

【思路1】将第一个字符移到最后面,执行n次,时间复杂度为O(m*n)。

 1 class Solution {
 2 public:
 3     string LeftRotateString(string str, int n) {
 4         if(str.length() <= n)
 5             return str;
 6         for(int i = 0;i < n;i ++){
 7                char c = str[0];
 8             for(int j = 0;j < str.length() - 1;j ++)
 9                 str[j] = str[j + 1];
10             str[str.length() - 1] = c;
11         }
12         return str;
13     }
14 };

【思路2】使用STL中的reverse()函数,时间复杂度O(n)。

假设原序列有n位,循环左移i位的过程如下:

(1)reverse(0,i-1); (2)reverse(i,n-1); (3)reverse(1,n-1);

例如原序列:abcdefg,循环左移3位:(1) cba defg  (2)cba gfed  (3) defgabc
代码就非常简单了,而且reverse操作非常简单,效率高也不容易出错,要记住一点就是STL中的迭代器是左闭右开区间,所以reverse操作的第二个参数需要往后移动一位。
 1 class Solution {
 2 public:
 3     string LeftRotateString(string str, int n) {
 4         if(str.length() <= n)    return str;
 5         reverse(str.begin(),str.begin() + n);
 6         reverse(str.begin() + n,str.end());
 7         reverse(str.begin(),str.end());
 8         return str;
 9     }
10 };

【思路3】使用substr()函数。

注:str.substr(pos, n)返回一个字符串,包含s中从下标pos开始的n个字符。

 1 class Solution {
 2 public:
 3     string LeftRotateString(string str, int n) {
 4         int len = str.length();
 5         if(len <= n) return str;
 6         n %= len;
 7         str += str;
 8         return str.substr(n,len);
 9     }
10 };

 

推荐阅读