給定乙個字串,要求把字串前面的若干個字元移動到字串的尾部,如把字串「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 mainimport(
"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...