字符串的移动
解法一、暴力移位法
初看此题,可能最先想到的方法是按照题目所要求的,把需要移动的字符一个一个的移动到字符串的尾部,如此我们可以实现一个函数LeftShiftOne(char
*s, int n) ,以完成移动一个字符到字符串尾部的功能,代码如下所示:
void LeftShiftOne(char *s, int n)
{
}
因此,若要把字符串开头的m个字符移动到字符串的尾部,则可以如下操作:
void LeftShiftString(char *s, int n, int m)
{
}
解法二、三步反转法
对于这个问题,换一个角度:
将一个字符串分成X和Y两个部分,在每部分字符串上定义反转操作,如X^T,即把X的所有字符反转(如,X="abc",那么X^T="cba"),那么就得到下面的结论:(X^TY^T)^T=YX。显然这解决了字符串的反转问题。
例如字符串 abcdef ,若要让def翻转到abc的前头,只要按下述3个步骤操作即可:
首先分为俩部分,X:abc,Y:def;
将X反转,X->X^T,即得:abc->cba;将Y反转,Y->Y^T,即得:def->fed。
反转上述得到的结果字符串X^TY^T,即字符串cbafed的两部分(cba和fed)给予反转,得到:cbafed->defabc,形式化表示为(X^TY^T)^T=YX,这就实现了整个反转。
void reverse(char *s,int from,int to)
{
}
void LeftRotateString(char *s,int n,int m)
//n为字符串大小,m为移动位数
{
}