題目及解法來源于LeetCode:
作者:LeetCode-Solution
鏈接:https://leetcode-cn.com/problems/reverse-words-in-a-string/solution/fan-zhuan-zi-fu-chuan-li-de-dan-ci-by-leetcode-sol/
問題描述:給定一個字符串,逐個翻轉(zhuǎn)字符串中的每個單詞。
示例 1:
輸入: "the sky is blue"
輸出: "blue is sky the"
示例 2:
輸入: " hello world! "
輸出: "world! hello"
解釋: 輸入字符串可以在前面或者后面包含多余的空格,但是反轉(zhuǎn)后的字符不能包括。
示例 3:
輸入: "a good example"
輸出: "example good a"
解釋: 如果兩個單詞間有多余的空格,將反轉(zhuǎn)后單詞間的空格減少到只含一個。
說明:
無空格字符構(gòu)成一個單詞。
輸入字符串可以在前面或者后面包含多余的空格,但是反轉(zhuǎn)后的字符不能包括。
如果兩個單詞間有多余的空格,將反轉(zhuǎn)后單詞間的空格減少到只含一個。
思路及算法:
由于雙端隊列支持從隊列頭部插入的方法,因此我們可以沿著字符串一個一個單詞處理,然后將單詞壓入隊列的頭部,再將隊列轉(zhuǎn)成字符串即可。
實現(xiàn)代碼:
class Solution {
public String reverseWords(String s) {
int left = 0, right = s.length() - 1;
// 去掉字符串開頭的空白字符
while (left <= right && s.charAt(left) == ' ') ++left;
// 去掉字符串末尾的空白字符
while (left <= right && s.charAt(right) == ' ') --right;
Deque<String> d = new ArrayDeque();
StringBuilder word = new StringBuilder();
while (left <= right) {
char c = s.charAt(left);
if ((word.length() != 0) && (c == ' ')) {
// 將單詞 push 到隊列的頭部
d.offerFirst(word.toString());
word.setLength(0);
} else if (c != ' ') {
word.append(c);
}
++left;
}
d.offerFirst(word.toString());
return String.join(" ", d);
}
}
復(fù)雜度分析:
時間復(fù)雜度:O(N),其中 N 為輸入字符串的長度。
空間復(fù)雜度:O(N),雙端隊列存儲單詞需要 O(N) 的空間。