1.字符串的旋转
将字符串‘abcdef’中头部的‘abc’移到字符串的尾部,变成‘defabc’
用蛮力法将头部的字符逐个移动到字符串末尾,需要O(m*n)次移动(m是需要移动的字符的个数,n是字符串的长度)。
比较好的解决方法是三步反转法:将需要移动和不需要移动两个部分的字符串分别反转,然后再对整体字符串进行反转,即可达到目的。
void LeftRotateString( char* s, int n, int m )
{
//如果n>m,就和左移m%n是等价的
m%=n;
ReverseString( s,0,m-1 );
ReverseString( s,n,n-1 );
//整体反转
ReverseString( s,0,n-1 );
}
void ReverseString( char* s,int left,int right )
{
while( left<right )
{
char* t=s[right];
s[right--]=s[left];
s[left++]=t;
}
}