LeetCode151- 翻轉字符串裏的單詞(Reverse Words in a String)

LeetCode151- 翻轉字符串裏的單詞(Reverse Words in a String)

最近全國疫情嚴重,待在家裏沒事幹,馬上又要準備春招了,最近刷刷題,記錄一下!再說一句,武漢加油,大家出門記得戴口罩!

1、題目

給定一個字符串,逐個翻轉字符串中的每個單詞。
示例 1:

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

示例 2:

輸入: "  hello world!  "
輸出: "world! hello"
解釋: 輸入字符串可以在前面或者後面包含多餘的空格,但是反轉後的字符不能包括。

說明:
無空格字符構成一個單詞。
輸入字符串可以在前面或者後面包含多餘的空格,但是反轉後的字符不能包括。
如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。
進階:
請選用 C 語言的用戶嘗試使用 O(1) 額外空間複雜度的原地解法。

2、思路

(數組翻轉) O(n)
分兩步操作:

  1. 將字符串中的每個單詞逆序,樣例輸入變爲: “eht yks si eulb”;
  2. 將整個字符串逆序,樣例輸入變爲:“blue is sky the”;
    時間複雜度分析:整個字符串總共掃描兩遍,所以時間複雜度是 O(n)。且每次翻轉一個字符串時,可以用兩個指針分別從兩端往中間掃描,每次交換兩個指針對應的字符,所以額外空間的複雜度是 O(1)。

3、代碼

class Solution {
public:
    string reverseWords(string s) {
        int k=0; //當前實際存的終點的位置
        for(int i=0;i<s.size();i++)
        {
            //先把連續空格過濾掉
            while(i<s.size()&&s[i]==' ') i++;
            if(i==s.size()) break;
            //否則
            int j=i;
            while(j<s.size()&&s[j]!=' ') j++;
            reverse(s.begin()+i,s.begin()+j);
            if(k) s[k++]=' ';
            while(i<j) s[k++]=s[i++];
        }
        s.erase(s.begin()+k,s.end());
        reverse(s.begin(),s.end());
        return s; 
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章