日常 演算法 旋轉字串 三步翻轉法

2021-09-27 09:05:58 字數 1143 閱讀 4278

給定乙個字串,要求把字串前面的若干個字元移動到字串的尾部,如把字串「abcdef」前面的2個字元'a'和'b'移動到字串的尾部,使得原字串變成字串「cdefab」。請寫乙個函式完成此功能,要求對長度為n的字串操作的時間複雜度為 o(n),空間複雜度為 o(1)。

對於這個問題,換乙個角度思考一下。

將乙個字串分成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,這就實現了整個反轉。

c語言版:

#include #include void reversestring(char* s,int from,int to) 

}void leftrotatestring(char* s,int n,int m)

int main()

go語言版:

package main

import(

"fmt"

)func reversestring(s byte,from int,to int)

}}func leftrotatestring(s byte,n int,m int)

func main()

php版:

<?php

function reversestring(&$str,$from,$to)

}function leftrotatestring(&$str,$n,$m)

$a="hello world";

leftrotatestring($a,strlen($a),2);

echo $a."\n";

字元陣列逆序(三步旋轉法)

有乙個字元陣列的內容為 student a am i 請你將陣列的內容改為 i am a student 要求 不能使用庫函式。只能開闢有限個空間 空間個數和字串的長度無關 有乙個字元陣列的內容為 student a am i 請你將陣列的內容改為 i am a student define crt...

逆置字串之三步翻轉

對於逆置字串這個問題,想必大家都覺得很簡單,設定兩個下標指向字串頭尾,交換下標指向位置內容,左下標加,右下標減,直到下標相交。實現 也很簡單,不超過15行。void reverse char left,char right 那麼看看這個類似的問題 將 you love i 變為 i love you...

三步翻轉法 有意思的方法

1.實現乙個函式,可以左旋字串中的k個字元。aabcd左旋乙個字元得到abcda aabcd左旋兩個字元得到bcdaa 首先還是把main 函式給出來 這裡取函式名為move left include include include includeint main 方法一 移位根據k的值,需要逆序2...