Java AC
public class Solution { private int len; public ArrayList<String> fullJustify(String[] words, int L) { ArrayList<String> list = new ArrayList<String>(); len = words.length; // 统计每个单词的长度 int numArr[] = new int[len]; for (int i = 0; i < len; i++) { numArr[i] = words[i].length(); } dfs(list, words, numArr, 0, L); // 处理最后一行字符,中间只包含一个空格 int size = list.size(); String lastLine = list.get(size - 1); list.remove(size-1); lastLine = lastLine.trim().replaceAll("[ ]+", " "); int len = lastLine.length(); while (len < L) { lastLine += " "; len++; } list.add(lastLine); return list; } private void dfs(ArrayList<String> list, String[] words, int[] numArr, int start, int l) { if (start >= len) { return; } // 统计每行最多可以存放几个单词,长度是多少. int tempLen = 0; int i = start; while (i < len && tempLen < l) { tempLen += numArr[i]; tempLen += 1; i++; } if (i != start) { i--; } if (tempLen > l+1) { tempLen -= numArr[i]; tempLen -= 1; i -= 1; } int wordNum = i - start + 1; StringBuilder sb = new StringBuilder(); // 这里主要为了处理出现的字符为"" if (tempLen == 0) { sb.append(words[start]); for (int j = 0; j < l; j++) { sb.append(" "); } }else { tempLen -= wordNum; int leftNum = l - tempLen; // 单词数为1,不需要处理空格问题. if (wordNum == 1) { sb.append(words[start]); for (int j = 0; j < leftNum; j++) { sb.append(" "); } }else { // 分布空格 int num1 = leftNum / (wordNum - 1); int num2 = leftNum % (wordNum - 1); for (int j = start; j < i; j++) { sb.append(words[j]); int k = 0; while (k < num1) { sb.append(" "); k++; } if (num2 > 0) { sb.append(" "); num2--; } } sb.append(words[i]); } } list.add(sb.toString()); dfs(list, words, numArr, i+1, l); } }