左旋转字符串

来源:互联网 发布:三星专用软件 编辑:程序博客网 时间:2024/04/30 02:16
26.左旋转字符串(字符串)
题目:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。
要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
//coder:Lee,20120316


#include<stdio.h>
#include<assert.h>
void LeftRotate_Solution1(char *A,unsigned int length,unsigned int step)
{
assert(A!=NULL&&length>0&&step>0&&step<=length);
int start=0;
unsigned int MoveNum=0;
while (MoveNum<length)
{
char temp=A[start];
int pre=start;
int next=(start+step)%length;
while(next!=start)
{
A[pre]=A[next];
pre=next;
next=(next+step)%length;
++MoveNum;
}
A[pre]=temp;
++MoveNum;
++start;
}


}
void Swap(char *a,char *b)
{
*a=*a^*b;
*b=*a^*b;
*a=*a^*b;
}
void LeftRotate_Solution2(char *A,unsigned int length,unsigned int step)
{
assert(A!=NULL&&length>0&&step>0&&step<=length);
if(length-step==0)
return;
if(length-step>=step)
{
for (unsigned int i=0;i<step;i++)
Swap(A+i,A+step+i);
LeftRotate_Solution2(A+step,length-step,step);
}
else
{
for (unsigned int i=0;i<length-step;i++)
Swap(A+2*step-length+i,A+step+i);
LeftRotate_Solution2(A,step,2*step-length);
}

}
void Reverse(char A[],int length)
{
assert(A!=NULL&&length>0);
int p=0;
int q=length-1;

while(p<q)
{
Swap(&A[p],&A[q]);
++p;
--q;
}
}
void LeftRotate_Solution3(char *A,unsigned int length,unsigned int step)
{
assert(A!=NULL&&length>0&&step>0&&step<=length);
Reverse(A,step);
Reverse(A+step,length-step);
Reverse(A,length);
}
int main()
{
const int sizestr=8;
const int step=3;
char A[sizestr]="abcdefg";
for (int i=0;i<sizestr-1;i++)
{
printf("%c ",A[i]);
}
printf("\n");
LeftRotate_Solution3(A,sizestr-1,step);
for (i=0;i<sizestr-1;i++)
{
printf("%c ",A[i]);
}
return 0;


}
原创粉丝点击