[LeetCode] 68. Text Justification
Given an array of words and a length L, format the text such that each line has exactly L characters and is fully (left and right) justified.
You should pack your words in a greedy approach; that is, pack as many words as you can in each line. Pad extra spaces
' '
when necessary so that each line has exactly L characters.
Extra spaces between words should be distributed as evenly as possible. If the number of spaces on a line do not divide evenly between words, the empty slots on the left will be assigned more spaces than the slots on the right.
For the last line of text, it should be left justified and no extra space is inserted between words.
For example,
words:
L:
words:
["This", "is", "an", "example", "of", "text", "justification."]
L:
16
.
Return the formatted lines as:
[ "This is an", "example of text", "justification. " ]
Note: Each word is guaranteed not to exceed L in length.
Corner Cases:
Time complexity:
- A line other than the last line might contain only one word. What should you do in this case?
In this case, that line should be left-justified.
Thought process:
Iterate through the words. Use a list to keep track of current words until their total lengths become longer than L. When that happens, call getLine().
- getLine(List of string, number of extra spaces):
- First, determine the number of spaces between each pair of words by calling distributeSpaces(number of words, number of extra spaces).
- distributeSpaces():
- If number of extra spaces % (number of words - 1) = 0, the number of spaces between each pair of words is number of spaces / number of words.
- Else, let offset = number of spaces % (number of words - 1). From left to right, each slot between two words gets number of spaces / (number of words - 1) + 1, and offset--. Every slot from left to right gets one extra space until offset is exhausted.
- Return a list of numbers of spaces.
- Combine words and spaces using a StringBuilder.
When I reaches the last line, combine the words together without spaces between them, and pad the line with spaces to the right.
Solution:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | public class Solution { public List<String> fullJustify(String[] words, int maxWidth) { List<String> lines = new ArrayList<>(); List<String> current = new ArrayList<>(); int length = 0; for (String word : words) { current.add(word); length += word.length(); int spaces = current.size() - 1; if (length + spaces == maxWidth) { lines.add(getLine(current, 0)); current.clear(); length = 0; } else if (length + spaces > maxWidth) { current.remove(current.size() - 1); length -= word.length(); int extraSpaces = maxWidth - length - (current.size() - 1); lines.add(getLine(current, extraSpaces)); current.clear(); current.add(word); length = word.length(); } } if (current.size() > 0) { lines.add(getLastLine(current, maxWidth - length - (current.size() - 1))); } return lines; } private String getLine(List<String> current, int spaces) { StringBuilder sb = new StringBuilder(); if (current.size() == 1) { sb.append(current.get(0)); for (int i = 0; i < spaces; i++) { sb.append(' '); } return sb.toString(); } List<Integer> distribution = distributeSpaces(current.size(), spaces); for (int i = 0; i < current.size(); i++) { sb.append(current.get(i)); if (i < current.size() - 1) { sb.append(' '); for (int j = 0; j < distribution.get(i); j++) { sb.append(' '); } } } return sb.toString(); } private List<Integer> distributeSpaces(int words, int spaces) { List<Integer> distribution = new ArrayList<>(); int extra = spaces % (words - 1); int quotient = spaces / (words - 1); if (extra == 0) { for (int i = 0; i < words - 1; i++) { distribution.add(quotient); } return distribution; } for (int i = 0; i < words - 1; i++) { if (extra > 0) { distribution.add(quotient + 1); extra--; } else { distribution.add(quotient); } } return distribution; } private String getLastLine(List<String> current, int spaces) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < current.size(); i++) { sb.append(current.get(i)); if (i < current.size() - 1) { sb.append(' '); } } for (int i = 0; i < spaces; i++) { sb.append(' '); } return sb.toString(); } } |
Time complexity:
O(number of lines * L). But number of lines is unknown.
Comments
Post a Comment