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)
分兩步操作:
- 將字符串中的每個單詞逆序,樣例輸入變爲: “eht yks si eulb”;
- 將整個字符串逆序,樣例輸入變爲:“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;
}
};