字符串移位
问题描述
给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“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。
}