LeetCode-151-翻轉字串裡的單詞

雄獅虎豹發表於2022-01-31

翻轉字串裡的單詞

題目描述:給你一個字串 s ,逐個翻轉字串中的所有 單詞 。

單詞 是由非空格字元組成的字串。s 中使用至少一個空格將字串中的 單詞 分隔開。

請你返回一個翻轉 s 中單詞順序並用單個空格相連的字串。

說明:

  • 輸入字串 s 可以在前面、後面或者單詞間包含多餘的空格。
  • 翻轉後單詞間應當僅用一個空格分隔。
  • 翻轉後的字串中不應包含額外的空格。

示例說明請見LeetCode官網。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:字串遍歷

首先,如果字串s是空串或者只由空格組成,則直接返回空串。

否則,首先將s去掉前後的空格,遍歷字串s,宣告一個單詞列表words用來記錄遍歷到的單詞,一個臨時辦理lastChar記錄上一個字元,lastChar初始化為空格,遍歷過程如下:

  • 如果當前字元和上一個字元都是空格,則跳過處理下一個字元;
  • 如果當前字元是空格而上一個字元不是空格,說明上一個字元是當前單詞的結束符號,將該單詞新增到單詞列表中;
  • 如果當前字元不是空格而上一個字元是空格,說明當前字元是單詞的開始符號;
  • 如果當前字元和上一個字元都不是空格,說明當前單詞並未結束。

遍歷結束後,將當前最後一個單詞新增到單詞列表words中,然後使用Collections.reverse方法將單詞列表words逆序排列,最後使用String.join(" ", words)方法將單詞用空格分開連線起來並返回。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class LeetCode_151 {
    public static String reverseWords(String s) {
        if (s == null || s.length() == 0 || s.trim().length() == 0) {
            return "";
        }
        List<String> words = new ArrayList<>();
        s = s.trim();
        StringBuilder curWord = new StringBuilder();
        char lastChar = ' ';
        for (int i = 0; i < s.length(); i++) {
            char curChar = s.charAt(i);
            if (curChar == ' ' && lastChar == ' ') {
                // 如果當前字元和上一個字元都是空格,則跳過處理下一個字元
                continue;
            } else if (curChar == ' ' && lastChar != ' ') {
                // 如果當前字元是空格而上一個字元不是空格,說明上一個字元是當前單詞的結束符號,將該單詞新增到單詞列表中
                words.add(curWord.toString());
                curWord = new StringBuilder();
                lastChar = ' ';
            } else if (curChar != ' ' && lastChar == ' ') {
                // 如果當前字元不是空格而上一個字元是空格,說明當前字元是單詞的開始符號
                curWord.append(curChar);
                lastChar = curChar;
            } else if (curChar != ' ' && lastChar != ' ') {
                // 如果當前字元和上一個字元都不是空格,說明當前單詞並未結束
                curWord.append(curChar);
                lastChar = curChar;
            }
        }
        words.add(curWord.toString());

        Collections.reverse(words);
        return String.join(" ", words);
    }

    public static void main(String[] args) {
        // 測試用例,期望輸出結果:
        // bob like even not does Alice
        System.out.println(reverseWords("   Alice does not even like    bob   "));
    }
}
【每日寄語】 做人要不斷的往前走,難免會跌倒但是要爬起來再跑,再跌倒再爬起來,做人就是這樣的。

相關文章