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".

分析

思路很簡單,就是先翻轉整個字符串,然后再逐一翻轉每個單詞;或者先逐一翻轉每個單詞,再翻轉整個字符串。

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

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

要點

in-place算法一般要使用兩個指針,一個指針負責遍歷,另一個指針負責拷貝覆蓋。

時間復雜度

O(n)

空間復雜度

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());
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容