字符串的旋转
本文博客是基于july大神的著作《编程之法-面试和算法心得》中的字符串一章的笔记。july,可以说从大一开始就一直读他的博客,从最基础的算法,到后来听起来高大上的机器学习算法,当google之一个算法不懂时就拜读july的博客,可以说一年来一直受july大神博客的影响。本文是此书的第一章—字符串的旋转。
题目描述:给定一个字符串,要求将字符串前面的若干个字符移到字符串的尾部。如,将字符串“abcdef”的前3个字符‘a’,‘b’,‘c’移到字符串的尾部,那么原来的字符串将变成“defabc”。请写一个函数实现此功能。
解法一:
初看此题,可能最先想到方法为将需要移动的字符一个一个地移到字符串的尾部,代码如下:
题目描述:给定一个字符串,要求将字符串前面的若干个字符移到字符串的尾部。如,将字符串“abcdef”的前3个字符‘a’,‘b’,‘c’移到字符串的尾部,那么原来的字符串将变成“defabc”。请写一个函数实现此功能。
解法一:
初看此题,可能最先想到方法为将需要移动的字符一个一个地移到字符串的尾部,代码如下:
void leftShiftOne(char *s,int n)
{
char t = s[0];
int i;
for(i=1;i<n;i++)
s[i-1]=s[i];
s[n-1]=t;
}
接下来调用m次此函数,使得字符串开头的m个字符移到字符串的尾部:
void LeftRotateString(char *s,int n,int m)
{
while(m--)
{
leftShiftOne(s,n);
}
}
这样即可完成任务,但是发现,时间复杂度为O(mn),那么有