【雙端隊列】翻轉(zhuǎn)字符串里的單詞(LeetCode)

題目及解法來源于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) 的空間。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容