入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

字符串移位的解题技巧

创建时间:2016-08-28 投稿人: 浏览次数:156

题目链接:左旋转字符串

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

分析:初看到这题,感觉十分简单,写两个循环即可,先把后面的字符串提取出来,再将前面的放在后面即可得到。代码如下:

class Solution {
public:
    string LeftRotateString(string str, int n) {
        string s = "";
        for(int i = n;i<str.length();++i)
            s+=str[i];
        for(int i = 0;i<n;++i)
            s+=str[i];
        return s; 
    }
};

或者利用substr函数:

class Solution {
public:
    string LeftRotateString(string str, int n) {
        int lens=str.size();
        if (lens<n)  
			return str;
        return str.substr(n)+str.substr(0,n);
    }
};

但是除了这个比较直观的方法,这题还有其它思路比较巧妙的方法,讨论如下。

(1)可以借鉴翻转子串的解题技巧这篇博客里字符串处理得思路,将原字符串自己和自己连接在一起,再取其中一部分子串即可得到,代码如下:

class Solution {
public:
    string LeftRotateString(string str, int n) {
        int len = str.length();
        if(len == 0) return "";
        n = n % len;
        str += str;
        return str.substr(n, len);
    }
};
(2)可以采用reverse()函数操作。举例一个序列abcdefg向左循环移动3位,则会得到(defg)(abc),我们可以将原字符串分为两个部分,A=(abc),B=(defg),那么原字符串为AB,我们要的结果为BA,可以如下进行操作:(ArBr)r = ((B)r)r((A)r)r=BA。其中r代表进行reverse()函数操作。可以得到具体操作过程如下:

(i)cba defg 

(ii)cba gfed

(iii) defgabc
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。