描述:給定乙個字串,要求將字串前面的若干字元移到字串的末尾。例如,將字串的 「abcdef」 的前面 3 個字元 『a』, 『b』 『c』 移到字串的末尾,那麼原字串將變成 「defabc」。
解法一:蠻力移位(迴圈左移)
較為直觀的一種解法即是,將需要移動的字元使用迴圈左移(rol,ring shift left)的方式乙個乙個地移到字串的尾部。
// 迴圈左移 1 位,迴圈左移k位的輔助函式
void rol1(char* s, int n)
// 迴圈左移 k 位
void rolk(char* s, int n, int k)
時間複雜度分析:對於長度為 n 的字串,如果左移 m 位的話,時間複雜度為o(mn).
解法二:三步反轉
這是乙個稍具 tricky 的解法,且解法具有普世性,句子中單詞的翻轉,即可使用該解法解決:
// 輔助函式
void reversestring(char* s, int
from, int to)
}// 三步反轉
void leftrotatestring(char* s, int n, int m)
時間複雜度為:o(n)
輸入乙個英文句子,翻轉句子中單詞的順序,要求單詞內字元的順序不變,句子中單詞以空格符隔開。為簡單起見,標點符號和普通字母做同樣處理。
「i am a student.」 ⇒ 「student. a am i」
沿用「三步反轉」法的思路,先將每個單詞自翻轉,再整體翻轉,求解的難點在於,每個單詞的確定,我們使用陣列索引的方式確定每個單詞的起始和截止。
void reversewords(char* s, int n)
; int idx = 0;
for (int i = 0; i
< n; ++i)
idx -= 1;
reversestring(s, 0, arr[0]-1);
for (int i = 0; i
< idx; ++i)
reversestring(s, arr[idx] + 1, n-1);
reversestring(s, 0, n - 1);
}
翻轉字串 翻轉單詞字串
將一句話裡面的單詞進行倒置,標點符號不倒換。比如一句話 i come from china.倒換後變成 china.from come i 解析 解決該問題可以分為兩步,第一步全盤置換為 anihc morf emoc i 第二部對每個單詞進行逐步翻轉,如果不是空格,則開始翻轉單詞。具體 如下 in...
演算法題目 翻轉單詞順序 VS 左旋轉字串
輸入乙個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。include include include using namespace std void reverse char pbegin,char pend char reversesentence char pdata else if...
字串 單詞翻轉
輸入乙個英文句子,翻轉句子中單詞的順序,要求單詞內字元的順序不變。標點視為單詞的一部分,單詞間以空格分開。顯然,先將整個字串翻轉,再翻轉以空格隔開的各個小區間即可。這裡需要用空格將字串分成多個小區間,這種需求在split等函式中也有。上 include include 翻轉p到q之間的內容,包括p和...