26 左旋轉字串

2021-06-05 03:23:56 字數 1308 閱讀 2315

題目:

定義字串的左旋轉操作:把字串前面的若干個字元移動到字串的尾部。

如把字串abcdef左旋轉2位得到字串cdefab。請實現字串左旋轉的函式。

要求時間對長度為n的字串操作的複雜度為o(n),輔助記憶體為o(1)。

分析:

一、如果不考慮時間和空間複雜度的限制,最簡單的方法莫過於把這道題看成是把字串分成前後兩部分,通過旋轉操作把這兩個部分交換位置。於是我們可以新開闢一塊長度為

n+1的輔助空間,把原字串後半部分拷貝到新空間的前半部分,在把原字串的前半部分拷貝到新空間的後半部分。不難看出,這種思路的時間複雜度是

o(n)

,需要的輔助空間也是

o(n)

。二、先將頭指標拷貝給head,然後將字串頭指標str指向第k(左旋字元的個數)位置,然後將head開始的前k個字元拷貝在str的後k位!

**如下:

#include void leftrotate(char**str,int n,int k);

int main()

void leftrotate(char **str,int n,int k)

(*str)+=k;

for (i=0;i三、

我們還是把字串看成有兩段組成的,記位xy。左旋轉相當於要把字串xy變成yx。我們先在字串上定義一種翻轉的操作,就是翻轉字串中字元的先後順序。把x翻轉後記為xt

。顯然有(xt)t=x。

我們首先對x和y兩段分別進行翻轉操作,這樣就能得到xtyt

。接著再對xtyt

進行翻轉操作,得到(xtyt)t=(yt)t(xt)t=yx。正好是我們期待的結果。

分析到這裡我們再回到原來的題目。我們要做的僅僅是把字串分成兩段,第一段為前面m個字元,其餘的字元分到第二段。再定義乙個翻轉字串的函式,按照前面的步驟翻轉三次就行了。時間複雜度和空間複雜度都合乎要求。

**如下:

#include void rotate(char *str,int startindex,int endindex);

void leftrotate(char*str,int n,int k);

int main()

void leftrotate(char *str,int n,int k)

rotate(str,0,k-1);

rotate(str,k,n-1);

rotate(str,0,n-1);

}void rotate(char *str,int startindex,int endindex)

{ char temp;

while (startindex

26 左旋轉字串

題目 定義字串的左旋轉操作,把字串前面的若干個字元移動到字串的尾部 解 1.最笨的一種方法就是,每次將字串左移1個位置,然後把最左邊的字元放到最後,這樣移動滿次數就行,假設字串長度是n,要移動前面m個字元 m n 那麼,時間 o m n 2.程式設計珠璣上的題目,把n長字串分為m n m,記m長子串...

旋轉長度左旋轉字串 26

近期一直在查詢旋轉長度之類的問題,下午正好有機會和大家討論一下.26.左旋轉字串 如把字串abcdef左旋轉2位得到字串cdefab。請實現字串左旋轉的函式。要求時間對長度為n的字串操縱的複雜度為o n 輔助記憶體為o 1 每日一道理 愛,有的時候不需要山盟海誓的承諾,但她一定需要細緻入微的關懷與問...

Solution 26 左旋轉字串

問題描述 定義字串的左旋轉操作 將字串前面的若干個字元移動到字串的尾部。例如,字串 abcdef 左旋轉2位得到 cdefab 要求實現的演算法時間複雜度為o n 常數級空間複雜度。解決思路 整體翻轉 部分翻轉 程式 public class leftrotatestring reverse c,0...