演算法 從旋轉字串到翻轉單詞

2021-07-10 15:21:14 字數 1241 閱讀 2257

描述:給定乙個字串,要求將字串前面的若干字元移到字串的末尾。例如,將字串的 「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和...