[劍指 offer]--字符串--面試題58 - I. 翻轉單詞順序

1 題目描述

輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字符的順序不變。爲簡單起見,標點符號和普通字母一樣處理。例如輸入字符串"I am a student. “,則輸出"student. a am I”。

示例 1:

輸入: “the sky is blue”
輸出: “blue is sky the”
示例 2:

輸入: " hello world! "
輸出: “world! hello”
解釋: 輸入字符串可以在前面或者後面包含多餘的空格,但是反轉後的字符不能包括。
示例 3:

輸入: “a good example”
輸出: “example good a”
解釋: 如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。

說明:

無空格字符構成一個單詞。
輸入字符串可以在前面或者後面包含多餘的空格,但是反轉後的字符不能包括。
如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

2 解題思路

  • 方法:雙指針

  • 算法解析:

(1)倒序遍歷字符串 s ,記錄單詞左右索引邊界 i , j ;
(2)每確定一個單詞的邊界,則將其添加至單詞列表 res ;
(3)最終,將單詞列表拼接爲字符串,並返回即可。

  • 複雜度分析:

時間複雜度 O(N) : 其中 N 爲字符串 s 的長度,線性遍歷字符串。
空間複雜度 O(N) : 新建的 list(Python) 或 StringBuilder(Java) 中的字符串總長度 ≤N ,佔用 O(N) 大小的額外空間。

作者:jyd
鏈接:https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof/solution/mian-shi-ti-58-i-fan-zhuan-dan-ci-shun-xu-shuang-z/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

3 解決代碼

  • 方法:雙指針《Java代碼》
class Solution {
    public String reverseWords(String s) {
        s = s.trim(); // 刪除首尾空格
        int j = s.length() - 1, i = j;
        StringBuilder res = new StringBuilder();
        while(i >= 0) {
            while(i >= 0 && s.charAt(i) != ' ') i--; // 搜索首個空格
            res.append(s.substring(i + 1, j + 1) + " "); // 添加單詞
            while(i >= 0 && s.charAt(i) == ' ') i--; // 跳過單詞間空格
            j = i; // j 指向下個單詞的尾字符
        }
        return res.toString().trim(); // 轉化爲字符串並返回
    }
}
  • 方法:雙指針《python代碼》
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) # 拼接並返回
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章