一、題目描述
題目:151.翻轉字符串裏的單詞
難度:中等
給定一個字符串,逐個翻轉字符串中的每個單詞。
示例 1:
輸入: “the sky is blue”
輸出: “blue is sky the”
示例 2:
輸入: " hello world! "
輸出: “world! hello”
解釋: 輸入字符串可以在前面或者後面包含多餘的空格,但是反轉後的字符不能包括。
示例 3:
輸入: “a good example”
輸出: “example good a”
解釋: 如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。
說明:
無空格字符構成一個單詞。
輸入字符串可以在前面或者後面包含多餘的空格,但是反轉後的字符不能包括。
如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。
進階:
請選用 C 語言的用戶嘗試使用 O(1) 額外空間複雜度的原地解法。
二、題解實現
1. 方法一:雙指針
算法解析:
- 倒序遍歷字符串 s ,記錄單詞左右索引邊界 i, j;
- 每確定一個單詞的邊界,則將其添加至單詞列表 res;
- 最終,將單詞列表拼接爲字符串,並返回即可。
複雜度分析:
- 時間複雜度 O(N): 其中 N爲字符串 s的長度,線性遍歷字符串。
- 空間複雜度 O(N) : 新建的list(Python) 或 StringBuilder(Java) 中的字符串總長度≤N ,佔用 O(N)大小的額外空間。
class Solution:
def reverseWords(self, s: str) -> str:
s = s.strip() # 刪除首尾空格
i = j = len(s) - 1
res = []
while i >= 0:
while i >= 0 and s[i] != ' ': i -= 1 # 搜索首個空格
res.append(s[i + 1: j + 1]) # 添加單詞
while s[i] == ' ': i -= 1 # 跳過單詞間空格
j = i # j 指向下個單詞的尾字符
return ' '.join(res) # 拼接並返回
2. 方法二:庫函數
利用 “字符串分割”、“列表倒序” 的內置函數 (面試時不建議使用) ,可簡便地實現本題的字符串翻轉要求。
算法解析:
- Python : 由於 split()方法將單詞間的 “多個空格看作一個空格” (參考自 split()和split(’ ')的區別 ),因此不會出現多餘的 “空單詞” 。因此,直接利用 reverse()方法翻轉單詞列表 strs,拼接爲字符串並返回即可。
複雜度分析:
時間複雜度
O(N): 總體爲線性時間複雜度,各函數時間複雜度和參考資料鏈接如下。
- split() 方法: 爲 O(N);
- trim() 和 strip() 方法: 最差情況下(當字符串全爲空格時),爲 O(N);
- join() 方法: 爲O(N) ;
- reverse() 方法: 爲 O(N) ;
空間複雜度
O(N) : 單詞列表 strs,佔用線性大小的額外空間。
class Solution:
def reverseWords(self, s: str) -> str:
s = s.strip() # 刪除首尾空格
strs = s.split() # 分割字符串
strs.reverse() # 翻轉單詞列表
return ' '.join(strs) # 拼接爲字符串並返回
3. 方法三:一行實現法
class Solution:
def reverseWords(self, s: str) -> str:
return ' '.join(s.strip().split()[::-1])
您的支持,是我不斷創作的最大動力~
歡迎點贊,關注,留言交流~
深度學習,樂此不疲~