左旋右旋字串

2021-07-09 08:23:28 字數 1213 閱讀 2839

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

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

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

分析:如果不考慮時間和空間複雜度的限制,

最簡單的方法莫過於把這道題看成是把字串分成前後兩部分,

通過旋轉操作把這兩個部分交換位置。

於是我們可以新開闢一塊長度為n+1 的輔助空間,

把原字串後半部分拷貝到新空間的前半部分,在把原字串的前半部分拷貝到新空間的後

半部分。

不難看出,這種思路的時間複雜度是o(n),需要的輔助空間也是o(n)。

把字串看成有兩段組成的,記位xy。左旋轉相當於要把字串xy 變成yx。

我們先在字串上定義一種翻轉的操作,就是翻轉字串中字元的先後順序。把x 翻轉後

記為xt。顯然有(xt)t=x。

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

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

分析到這裡我們再回到原來的題目。我們要做的僅僅是把字串分成兩段,

第一段為前面m 個字元,其餘的字元分到第二段。

再定義乙個翻轉字串的函式,按照前面的步驟翻轉三次就行了。

時間複雜度和空間複雜度都合乎要求。

所謂右旋:就是把字串右邊若干個單詞移動到字串頭部

舉例:abcdefg

- 右旋5位 -cdefgab

觀察:其實和左旋差不多,區別就是旋轉的單詞長度變化了。

即,右旋五位,相當於左旋2位。

思路:把右旋轉換為左旋做,就ok了。

void reverse(string& str, int nlow, int nhigh)

}

void rotatestring(string &str,int offset)//右旋
{

//wirte your code here

if(str=="") //判斷空字串情況直接返回

return;

int len=str.length();

offset%=len;

if(len

字串左旋右旋問題

如把字串abcdef 左旋轉2 位得到字串cdefab。要求時間對長度為n 的字串操作的複雜度為o n 輔助記憶體為o 1 分析 如果不考慮時間和空間複雜度的限制,最簡單的方法莫過於把這道題看成是把字串分成前後兩部分,通過旋轉操作把這兩個部分交換位置。於是我們可以新開闢一塊長度為n 1 的輔助空間,...

字串的左旋右旋問題

字串的左旋右旋其實是乙個問題,下面只對右旋進行分析。當乙個字串進行旋轉的時候,字串的大小會決定有效旋轉次數。這裡面的有效是指,後面的旋轉會與前面的旋轉相同,所以我們必須要對旋轉次數進行去重。如 aabb 一次右旋 baab 二次右旋 bbaa 三次右旋 abba 四次右旋 aabb 五次右旋 baa...

字串 旋轉字串 左旋或右旋k個字元

問題描述 將n個字元的陣列,迴圈右移k位。時間複雜度o n 比如原陣列序列為abcd1234,要求變換成的陣列序列為1234abcd,即迴圈右移了4位。問題分析 方法1 暴力位移法,時間複雜度為o m n 下面是左旋的方法,void leftshift1 char str,size t len,si...