給定乙個字串,要求把字串前面的若干個字元移動到字串的尾部,如把字串「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,這就實現了整個反轉。
void reverse(char *str, intfrom, int
to)}
void leftrotatestring(char *str, int
m)
類似題目:
給定乙個list,兩個int值,要求翻轉這個鍊錶的第i個到第j個元素之間鍊錶段
比如給定,1,3,得到3,2,1,4,5,6
**如下:(使用頭插法,但是注意這裡由於未必從頭結點開始所以單獨加入乙個頭結點可以簡化操作,)
//這裡有頭結點,對於有頭結點的話部分和完全倒置的**可以一樣,沒有頭結點還要加條件
listnode* reverse(listnode *root, int start, int
end)
//pri = now;
listnode* mov = now->next;
for(int i = start; i < end; ++i)
root = root->next;
return
root;
}
翻轉所有的結點:
listnode* reverseall(listnode *root)listnode *pri = root, *now = root->next;
while(now !=null)
root->next =null;
return
pri;
}
2、編寫程式,在原字串中把字串尾部的m個字元移動到字串的頭部,要求:長度為n的字串操作時間複雜度為o(n),空間複雜度為o(1)。 例如,原字串為」ilovebaofeng」,m=7,輸出結果為:」baofengilove」。
void rightrotatestring(char *str, intm)
3、單詞翻轉。輸入乙個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變,句子中單詞以空格符隔開。為簡單起見,標點符號和普通字母一樣處理。例如,輸入「i am a student.」,則輸出「student. a am i」。可以使用類似的方法或者使用stringstream
void reversewords(char *word)}reverse(word,
0, size - 1
);}
void reversewords(string &s)
void reversewords(string &s)s = ""
;
//cout << str[0] << 1233 << endl;
ostringstream oss;
for (size_t i = 0; i < str.size(); ++i)
oss.flush();
s =oss.str();
s = s.substr(0, s.size() - 1
);}
題目來自:
字串旋轉
問題 把字串前面的若干個字元移動到字串的尾部。如把字串abcdef前2位字元移到後面得到字串cdefab。要求時間對長度為n的字串操作的複雜度為o n 輔助記憶體為o 1 看到大多數的帖子都是進行三次旋轉 如 個人感覺這思路確實比較新穎,但是總感覺有點麻煩了,個人思路如下 include inclu...
字串旋轉
字串的左旋轉操作 把字串前面的若干個字元移動到字串的尾部。例如 aabcd左旋乙個字元得到abcda aabcd左旋兩個字元得到bcdaa 同理字串右旋操作 aabcd右旋乙個字元得到daabc aabcd右旋兩個字元得到cdaab 那麼今天就來說一下字串旋轉中的一些問題 首先說一下簡單的,先用函式...
旋轉字串
給定乙個字元型別的陣列 chas 和乙個整數 size,請把大小為 size 的左半區整 體移到右半區,右半區整體移到左邊。例如,如果把 chas 看作字串為 abcde size 3,調整成 deabc 如果 chas 長度為 n,兩道題都要求時間複雜度為 o n 額外空間複雜度為 o 1 兩種解...