?思路源自
leetcode-字符串篇 68題 文本左右對齊
?難度高的模擬類型題目,關鍵點在于事先知道有多少單詞要放在本行并且還要知道本行是不是最后一行(最后一行需要全部單空格右對齊,不是最后一行就空格均攤),非最后一行的空格要盡可能平等的均攤在相鄰單詞間的空隙內
class Solution {private String fillWords(String[] words, int begin, int end, int maxWidth, boolean lastLine) {int wordCount = end - begin + 1;//除去每一個單詞尾部空格和單詞本身長度看看多余多少空格int extraSpace = maxWidth + 1 - wordCount;for(int i=begin;i<=end;i++)extraSpace-=words[i].length();//額外空格的平均值int extraSpaceAvg = wordCount > 1 ? extraSpace / (wordCount - 1) : 1;//額外空格的余數int extraSpaceExtra = wordCount > 1 ? extraSpace % (wordCount - 1) : 0;//裝填數據,先裝填前n-1個,最后一個特殊處理StringBuilder stringBuilder = new StringBuilder();for(int i=begin;i<end;i++){stringBuilder.append(words[i]);if (lastLine) {stringBuilder.append(" ");continue;}//單詞后的空格個數為基本的1個加上平均的再加上多余的int n = 1 + extraSpaceAvg + (i - begin < extraSpaceExtra ? 1 : 0);while (n-->0)stringBuilder.append(" ");}//填入最后一個單詞和它的空格stringBuilder.append(words[end]);while (stringBuilder.length()<maxWidth)stringBuilder.append(" ");return stringBuilder.toString();}public List<String> fullJustify(String[] words, int maxWidth) {List<String> result = new ArrayList<>();int countLen = 0;//統計當前的單詞組是否超過maxWidthint begin = 0;//單詞組的起始單詞索引for (int i = 0; i < words.length; i++) {countLen += words[i].length() + 1;//如果是最后一個單詞,或者加上下一個單詞就超過長度,那么可以湊成一行if (i + 1 == words.length || countLen + words[i + 1].length() > maxWidth) {result.add(fillWords(words, begin, i, maxWidth, i + 1 == words.length));begin = i + 1;countLen = 0;}}return result;}
}