05 翻轉字串裡的單詞(leecode 151)

2021-10-18 02:45:49 字數 2319 閱讀 4688

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

說明:

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

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

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

示例 1:

輸入:「the sky is blue」

輸出:「blue is sky the」

示例 2:

輸入:" hello world! "

輸出:「world! hello」

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

示例 3:

輸入:「a good example」

輸出:「example good a」

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

示例 4:

輸入:s = " bob loves alice "

輸出:「alice loves bob」

示例 5:

輸入:s = 「alice does not even like bob」

輸出:「bob like even not does alice」

1 <= s.length <= 104

s 包含英文大小寫字母、數字和空格 ' '

s 中 至少存在乙個單詞

高階:

請嘗試使用 o(1) 額外空間複雜度的原地解法。
切片時需要排除空字元不進行拼接

class

solution

:def

reversewords

(self, s:

str)

->

str:

# 用' '進行切分單詞

world_list = s.split(

' ')

size =

len(world_list)

s_new =

''for i in

range

(size)

:# 逆序拼接單詞,排除空字元

if world_list[size -

1-i]

!=''

: s_new += world_list[size -

1-i]

+' '

# 去除末尾多加的' '

s_new = s_new.rstrip(

)return s_new

想一下,我們將整個字串都反轉過來,那麼單詞的順序指定是倒序了,只不過單詞本身也倒敘了,那麼再把單詞反轉一下,單詞就正過來了。

所以解題思路如下:

移除多餘空格(雙指標法)

將整個字串反轉

將每個單詞反轉

如動畫所示:

//2.移除中間空格

for(

; fastindex < s.

size()

; fastindex++

)//fastindex指向的元素為非空格

else

}//3.移除字串末尾空格,步驟2.去除中間空格時,會在結尾保留乙個空格

//由於s[slowindex++] = s[fastindex];slowindex接收完空格後又向後移動了乙個

if(slowindex -

1>

0&& s[slowindex -1]

==' '

)else

}//翻轉字串

void

reverse_s

(string &s,

int begin,

int end)

}//翻轉單詞

string reversewords

(string s)

//確定單詞結束位置

if(entry && s[i]

==' '

&& s[i -1]

!=' '

)//最後乙個單詞結束位置沒有空格

if(entry && i == s.

size()

-1&& s[i]

!=' ')}

return s;}}

;

翻轉字串裡的單詞

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

翻轉字串裡的單詞

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

翻轉字串裡的單詞

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