字符串移位

问题描述

给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符’a’和’b’移动到字符串的尾部,使得原字符串变成字符串“cdefab”

分析与解法

这个问题可以很容易的用三步反转来解决,将字符串的两部分分别反转,最后将整个字符串反转即可。

假设(X^T)表示字符串X的反转,XY表示字符串的连接。

那么题目就是要用过字符串XY求解YX。

有如下公式:

这个公式不难证明。

此解法的时间复杂度为O(n),空间复杂度O(1)。

代码

代码可以很容易的调用C++标准库的reverse算法时间。还是自己实现以下。

void ReverseString(char* s,int from,int to)
{
    while (from < to)
    {
        char t = s[from];
        s[from++] = s[to];
        s[to--] = t;
    }
}

void LeftRotateString(char* s,int n,int m)
{
    m %= n;               //若要左移动大于n位,那么和%n 是等价的
    ReverseString(s, 0, m - 1); //反转[0..m - 1],套用到上面举的例子中,就是X->X^T,即 abc->cba
    ReverseString(s, m, n - 1); //反转[m..n - 1],例如Y->Y^T,即 def->fed
    ReverseString(s, 0, n - 1); //反转[0..n - 1],即如整个反转,(X^TY^T)^T=YX,即 cbafed->defabc。
}