1. 程式人生 > 其它 >151. 顛倒字串中的單詞

151. 顛倒字串中的單詞

151. 顛倒字串中的單詞

給你一個字串 s ,顛倒字串中 單詞 的順序。

單詞 是由非空格字元組成的字串。s 中使用至少一個空格將字串中的 單詞 分隔開。

返回 單詞 順序顛倒且 單詞 之間用單個空格連線的結果字串。

注意:輸入字串 s中可能會存在前導空格、尾隨空格或者單詞間的多個空格。返回的結果字串中,單詞間應當僅用單個空格分隔,且不包含任何額外的空格。

示例 1:

輸入:s = "the sky is blue"
輸出:"blue is sky the"

示例 2:

輸入:s = "  hello world  "
輸出:"world hello"
解釋:顛倒後的字串中不能存在前導空格和尾隨空格。

示例 3:

輸入:s = "a good   example"
輸出:"example good a"
解釋:如果兩個單詞間有多餘的空格,顛倒後的字串需要將單詞間的空格減少到僅有一個。

提示:

  • 1 <= s.length <= 104
  • s 包含英文大小寫字母、數字和空格 ' '
  • s至少存在一個 單詞

進階:如果字串在你使用的程式語言中是一種可變資料型別,請嘗試使用 O(1) 額外空間複雜度的 原地 解法。

思路:

​ 使用O(1)額外空間複雜度,原地求解,主要看註釋把,這種題目需要自己畫圖理解

class Solution {
public:
    string reverseWords(string s) {
        //先反轉連結串列
        reverse(s.begin(),s.end());
        
        int index=0;
        for(int i=0;i<s.size();i++){
            //尋找一個單詞的開頭
            if(s[i]!=' '){
                if(index!=0)s[index++]=' ';//需要放置下一個單詞 那麼要加上空格
                int end=i;
                //把這個單詞放到index處去 
                while(end<s.size()&&s[end]!=' '){
                    s[index++]=s[end++];
                }
                // 反轉整個單詞 重點是要明白當前單詞所在區間
                reverse(s.begin() + index - (end-i), s.begin() + index);
                i=end;  
            }
        }
        //把尾部空格刪除
        s.erase(s.begin()+index,s.end());
        return s;
    }
};