题目:给定一个字符串,要求字符串前若干个字符移动字符串的尾部。例如,将“abcdef"前三个字符移到尾部,那么原字符串变为”defabc“。写一个函数实现此功能。
解法1:
暴力,也是容易想到的一种方法,即一个字符一个字符的移动到字符串末尾。假设字符串的长度为n,要移动的字符串前缀长度为m。
首先编写每次左移一位的函数LeftShiftOne
void LeftShiftOne(char *s,int n)
{
char t=s[0]; //保存第一个字符
for(int i=1;i<n;i++)
{
s[i-1]=s[i];
}
s[n-1]=t;
}
然后调用m次LeftShiftOne函数
void LeftRotateString(char *s,int n,int m)
{
while(m--)
{
LeftShiftOne(s,n);
}
}
由此可以解决这个问题
解法二:
采用三步旋转的方法,即部分整体旋转,三次之后就可以实现字符串整体的反转。
1.先把字符串分为两部分
2,分别旋转这两部分
3,把整体再次旋转
代码如下
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)
{
//向左移动大于n位,那么与%n是等价的
m%=n;
ReverseString(s,0,m-1);
ReverseString(s,m,n-1);
ReverseString(s,0,n-1);
}
时间复杂度为O(n),空间复杂度O(1)