题目:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。
要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
解决方法
先把0到k-1逆置,再把k到n-1逆置,再把0到n-1逆置。总的时间复杂度是O(n),空间复杂度因为没有额外的临时字符数组帮助,所以是本地操作,空间复杂度为O(1)
VS2010中运行程序如下:例子程序是正确的,,如果有什么错误,希望各位高手指定,,呵呵。。
#include<stdlib.h>
#include<string>
#include<iostream>
using namespace std;
//将字符串中从指针begin处到指针end处进行反转
void Reverse(char *begin,char *end)
{
if(NULL == begin || NULL == end)
return ;
while(begin < end)
{
char x = *begin;
*begin = *end;
*end = x;
begin ++;
end --;
}
}
//把字符串前面的n个字符移动到字符串的尾部。
void MoveToEnd(char *begin,const int n)
{
if(NULL == begin)
return ;
int Length = strlen(begin);//字符数组的长度
if((n > Length ) || 0 == n)
return;
else
{
char *FirstBegin = begin;
char *FirstEnd = begin + n - 1;
char *SecondBegin = begin +n;
char *SecondEnd = begin + Length - 1;
Reverse(FirstBegin,FirstEnd);
Reverse(SecondBegin,SecondEnd);
Reverse(FirstBegin,SecondEnd);
}
}
int main()
{
char a[] = "abcdef";
MoveToEnd(a,2);
cout<<a;
return 0;
}