151. Reverse Words in a String

問題

Given an input string, reverse the string word by word.

例子

Given s = "the sky is blue",
return "blue is sky the".

分析

思路很簡(jiǎn)單,就是先翻轉(zhuǎn)整個(gè)字符串,然后再逐一翻轉(zhuǎn)每個(gè)單詞;或者先逐一翻轉(zhuǎn)每個(gè)單詞,再翻轉(zhuǎn)整個(gè)字符串。

問題的關(guān)鍵在于字符串多余空格的處理:?jiǎn)卧~之間的空格可能不止一個(gè),字符串首尾也可能有若干空格,而題目要求輸出的結(jié)果字符串頭尾不能有空格,且單詞間有且只能有一個(gè)空格。進(jìn)一步的,題目要求使用in-place算法,即空間復(fù)雜度為O(1).

我們可以維護(hù)兩個(gè)指針k和i,i負(fù)責(zé)遍歷字符串,找到單詞;k負(fù)責(zé)依次拷貝單詞到字符串的首部,并用一個(gè)空格分割。i遇到多余的空格直接跳過。i遍歷結(jié)束之后,k指向結(jié)果子字符串的末尾,直接erase掉k以后的部分即可。

要點(diǎn)

in-place算法一般要使用兩個(gè)指針,一個(gè)指針負(fù)責(zé)遍歷,另一個(gè)指針負(fù)責(zé)拷貝覆蓋。

時(shí)間復(fù)雜度

O(n)

空間復(fù)雜度

O(1)

代碼

class Solution {
public:
    void reverseWords(string &s) {
        reverse(s.begin(), s.end());
        int k = 0;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] != ' ') {
                if (k != 0) s[k++] = ' ';
                int j = i;
                while (j < s.size() && s[j] != ' ')
                    s[k++] = s[j++];
                reverse(s.begin() + k - (j - i), s.begin() + k);
                i = j;
            }
        }
        s.erase(s.begin() + k, s.end());
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容