LeetCode筆記-翻轉字符串裏的單詞

一、題目描述

題目: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])

您的支持,是我不斷創作的最大動力~

歡迎點贊關注留言交流~

深度學習,樂此不疲~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章