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) # 拼接並返回