1. 程式人生 > >LeeCode 68: 文字左右對齊

LeeCode 68: 文字左右對齊

題目

給定一個單詞陣列和一個長度 maxWidth,重新排版單詞,使其成為每行恰好有 maxWidth 個字元,且左右兩端對齊的文字。

你應該使用“貪心演算法”來放置給定的單詞;也就是說,儘可能多地往每行中放置單詞。必要時可用空格 ' ' 填充,使得每行恰好有 maxWidth 個字元。

要求儘可能均勻分配單詞間的空格數量。如果某一行單詞間的空格不能均勻分配,則左側放置的空格數要多於右側的空格數。

文字的最後一行應為左對齊,且單詞之間不插入額外的空格。

說明:

  • 單詞是指由非空格字元組成的字元序列。
  • 每個單詞的長度大於 0,小於等於 maxWidth
  • 輸入單詞陣列 words 至少包含一個單詞。

示例:

輸入:
words = ["This", "is", "an", "example", "of", "text", "justification."]
maxWidth = 16
輸出:
[
   "This    is    an",
   "example  of text",
   "justification.  "
]

程式碼

class Solution {
    public List<String> fullJustify(String[] words, int maxWidth) {
        List<List<String>> groups = new ArrayList<>();
        List<String> row = new ArrayList<>();
        int rowLength = 0;
        for (int i = 0; i < words.length; i++) {
            if (words[i].length() + rowLength > maxWidth) {
                groups.add(row);
                row = new ArrayList<>();
                row.add(words[i]);
                rowLength = words[i].length() + 1;
            } else {
                row.add(words[i]);
                rowLength += words[i].length() + 1;
            }
            if (i == words.length - 1) {
                groups.add(row);
            }
        }

        List<String> result = new ArrayList<>();
        for (int i = 0; i < groups.size(); i++) {
            List<String> tempRow = groups.get(i);
            int tempLength = 0;
            for (String str : tempRow) {
                tempLength += str.length();
            }
            int spaceCount = maxWidth - tempLength;

            int everySpaceCount = 1, surplusSpaceCount = 0; // 每個單詞後的空格數, 多餘的空格數
            if (i != groups.size() - 1) {
                everySpaceCount = tempRow.size() > 1 ? spaceCount / (tempRow.size() - 1) : spaceCount;
                surplusSpaceCount = tempRow.size() > 1 ? spaceCount % (tempRow.size() - 1) : 0;
            }

            StringBuffer sb = new StringBuffer();
            for (int j = 0; j < tempRow.size(); j++) {
                sb.append(tempRow.get(j));
                if (j == tempRow.size() - 1) break;
                for (int k = 0; k < everySpaceCount; k++) {
                    sb.append(" ");
                }
                if (surplusSpaceCount > 0) {
                    sb.append(" ");
                    surplusSpaceCount--;
                }
            }
            if (sb.length() < maxWidth) { // 補充空格
                int currentLength = sb.length();
                for (int k = 0; k < maxWidth - currentLength; k++) {
                    sb.append(" ");
                }
            }
            result.add(sb.toString());
        }
        return result;
    }
}