LeetCode151 翻轉字串裡的單詞

2022-06-08 20:09:32 字數 1738 閱讀 6020

給定乙個字串,逐個翻轉字串中的每個單詞。

說明:無空格字元構成乙個 單詞 。

輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。

如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含乙個。

一、 從後往前找到找到單詞加入新字串

1

class

solution

1112

while(j >= 0 && s[j] != '')

15int tmp = j; //

儲存單詞前的空格位置,後移為單詞的起始位置

16 j++;

17while(j < s.length() && s[j] != '')

21 j =tmp;

22 res += '';

23}24if(*(res.end() -1) == '

') res.erase(res.end()-1

);25

return

res;26}

27 };

二、按照carl提高下該題的難度,就是使用就地演算法,不開闢新的字串,怎樣實現

1.去除多餘空格

2.整體字串反轉

3.單詞再反轉

首先移除多餘空格,不要上來直接用erase刪除,因為最快的刪除字串的元素的時間複雜度也是o(n),再在外部套一層迴圈,實際時間複雜度為方。如何將降低?雙指標。

1

class

solution

12//

若開頭有冗餘空格,利用雙指標將整體字串前移

13//

並且去除字串中間部分的冗餘空格---邏輯和27題一樣

14for(;fast < s.length();fast++)else20}

21//

此時slow指標指向了最後乙個單詞的有效字元的後乙個位置

22//

去除末尾的冗餘空格,用resize,slow之後都為冗餘字元

23if(slow > 0 && s[slow - 1] == '

') s.resize(slow - 1

);24

else

s.resize(slow);25}

26//

常見的陣列逆序操作,也是雙指標

27void reverse(string &s,int start,int

end)31}

3233

string reversewords(string

s) 44

if(((k > 0 ) && (s[k] == '

' )&& (s[k-1] != '

') &&(flag)))

4950

}51 reverse(s,i,s.length()-1

);52

53//

時間複雜度為n方的寫法

54//

while(j < s.length() && s[j] != ' ')

5758

//while(j < s.length())

62//

reverse(s,i,j -1);

63//

i = ++j;

6465//}

66return

s;67

}68 };

注意最後挑菜單詞進行反轉

LeetCode 151 翻轉字串

給定乙個字串,逐個翻轉字串中的每個單詞。示例 1 輸入 the sky is blue 輸出 blue is sky the 示例 2 輸入 hello world 輸出 world hello 解釋 輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。示例 3 輸入 a good ...

Leetcode 151 翻轉字串

給定乙個字串,逐個翻轉字串中的每個單詞。示例 1 輸入 the sky is blue 輸出 blue is sky the 示例 2 輸入 hello world 輸出 world hello 解釋 輸入字串可以在前面或者後面包含多餘的空格,但是反轉後的字元不能包括。示例 3 輸入 a good ...

leetcode151翻轉字串單詞

leetcode151.翻轉字串裡的單詞 題目描述 給定乙個字串,逐個翻轉字串中的每個單詞 示例 輸入 the sky is blue 輸出 blue is sky the 再這裡需要逐一的是輸入的字串可以在前面或者後面包含多餘的空格,但反轉後的單詞間的空格只能減少到乙個。思路 在這裡考慮進行兩次翻...