LeeCode 68: 文字左右對齊
阿新 • • 發佈:2018-12-12
題目
給定一個單詞陣列和一個長度 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; } }