# 0068. Text Justification ###### tags: `Leetcode` `Hard` `String` Link: https://leetcode.com/problems/text-justification/description/ ## 思路 这题不难就是比较麻烦 我们首先要算出每行结尾的单词 然后算出每一行有哪些单词之后 再把它放到一行里 放的时候有很多条件需要考虑 1. 如果这一行只有一个单词或者这是最后一行 那就要左对齐 并且单词之间的空格数为1 2. 其他情况就要平均分配空格 并且保证末尾不是空格 ## Code ```java= class Solution { public List<String> fullJustify(String[] words, int maxWidth) { int left = 0, right = 0, n = words.length; List<String> ans = new ArrayList<>(); while(left<n){ right = findRight(words, left, maxWidth); ans.add(printLine(left, right, words, maxWidth)); left = right+1; } return ans; } private int findRight(String[] words, int left, int maxWidth){ int idx = left; int currLen = 0; int right = left; while(idx<words.length){ currLen += words[idx].length(); if(currLen<=maxWidth) right = idx; else break; currLen += 1; idx++; } return right; } private String printLine(int left, int right, String[] words, int maxWidth){ int n = right-left+1; int blank = maxWidth; StringBuilder sb = new StringBuilder(); for(int i=left; i<=right; i++) blank -= words[i].length(); if(n==1||right==words.length-1){ for(int i=left; i<=right; i++){ sb.append(words[i]); if(i!=right){ sb.append(" "); blank--; } else sb.append(" ".repeat(blank)); } } else{ int each = blank/(n-1); int remain = blank%(n-1); for(int i=left; i<=right; i++){ if(i==right){ sb.append(words[i]); } else{ sb.append(words[i]+" ".repeat(each)); if(i-left<remain) sb.append(" "); } } } return sb.toString(); } } ```