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

題目:
  定義字符串的左旋轉操作:把字符串前面的若干個字符移動到字符串的尾部。
    如把字符串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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章