0068. Text Justification
Description
**Input:** words = ["This", "is", "an", "example", "of", "text", "justification."], maxWidth = 16
**Output:**
[
"This is an",
"example of text",
"justification. "
]ac
Last updated
**Input:** words = ["This", "is", "an", "example", "of", "text", "justification."], maxWidth = 16
**Output:**
[
"This is an",
"example of text",
"justification. "
]Last updated
**Input:** words = ["What","must","be","acknowledgment","shall","be"], maxWidth = 16
**Output:**
[
"What must be",
"acknowledgment ",
"shall be "
]
**Explanation:** Note that the last line is "shall be " instead of "shall be", because the last line must be left-justified instead of fully-justified.
Note that the second line is also left-justified becase it contains only one word.**Input:** words = ["Science","is","what","we","understand","well","enough","to","explain","to","a","computer.","Art","is","everything","else","we","do"], maxWidth = 20
**Output:**
[
"Science is what we",
"understand well",
"enough to explain to",
"a computer. Art is",
"everything else we",
"do "
]class Solution {
public List<String> fullJustify(String[] words, int maxWidth) {
// edge cases
int i = 0, n = words.length;
List<String> res = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
while (i < n) {
sb.setLength(0); // restart a new line
// how many words in this line? what is the baseSpace? how many empty slot have extra space?
int[] info = wordsInLine(words, i, maxWidth);
if (info[0] == 1) { // only one word
sb.append(words[i]).append(generateSpace(maxWidth - words[i].length())); // left justify
i++;
} else if (i + info[0] >= words.length) { // last line
while (info[0]-- > 0) {
sb.append(words[i++]);
if (sb.length() < maxWidth) sb.append(" ");
}
if (sb.length() < maxWidth) sb.append(generateSpace(maxWidth - sb.length())); // pad with space
} else { // normal situation
while (info[0]-- > 0) { // append x words
sb.append(words[i++]);
// append space
if (info[0] != 0) { // no need to append in last word
int spaceCnt = info[2]-- > 0 ? info[1] + 1 : info[1];
sb.append(generateSpace(spaceCnt));
}
}
}
// add this line to result
res.add(sb.toString());
}
return res;
}
private int[] wordsInLine(String[] words, int start, int maxWidth) {
int len = 0, wordLen = 0, cnt = 0;
for (int i = start; i < words.length; i++) {
len += words[i].length();
if (len > maxWidth) break;
cnt++; // add one word
wordLen += words[i].length();
len++; // add one space
}
// base space of empty slot
int baseSpace = cnt > 1 ? (maxWidth - wordLen) / (cnt - 1) : 0;
int extraSpaceCnt = cnt > 1 ? (maxWidth - wordLen) % (cnt - 1) : 0;
return new int[]{cnt, baseSpace, extraSpaceCnt};
}
private String generateSpace(int n) {
StringBuilder sb = new StringBuilder();
while (sb.length() < n) {
sb.append(" ");
}
return sb.toString();
}
}
/*
its just implementation dirty work. for each line: how many words in this line? what is the baseSpace? how many empty slot have extra space? Then process accordingly: 1) just one word; 2) last line; 3) normal situation
*/