算法十二----左旋转字符串

题目:
  定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
    如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。
    要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
算法思路:
把字符串看做由两段组成,记作XY,题目的意思是要求出YX。
记R(X)为X字符串旋转后的字符串,则R(R(X))=X,于是有R(YX)=R(R(X)R(Y))=YX
所以我们只需要把字符串分为两段,分别求出两段字符串的旋转字符串,然后再对含有包含两段旋转后的字符串的字符串进行旋转就能得到结果了。
算法伪代码如下:
LeftRotateStr(char *str, unsigned int k)
     split str to two part

     //one part is 0-k-1,another is k-n-1
     reverse two part of the str

     reverse the str with two reversed part

C++实现
char * LeftRotateStr(char *str, unsigned int k)
{
    if(str != NULL)
    {
        //split str to two part
        int len = static_cast<int>(strlen(str));
        char *firstStrStart = str;
        char *firstStrEnd = str+k-1;
        char *secondStrStart = str+k;
        char *secondStrEnd = str+len-1;
        
        //reverse two part of the str
        ReverseStr(firstStrStart,firstStrEnd);
        ReverseStr(secondStrStart, secondStrEnd);

        //reverse the str with two reversed part
        ReverseStr(firstStrStart, secondStrEnd);
    }

    return str;
}



发布了90 篇原创文章 · 获赞 45 · 访问量 71万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章