Top Interview 150
The Text Justification problem is a great test of string manipulation and greedy algorithms. Letβs tackle LeetCode 68: Text Justification and solve it step by step.
π Problem Description
Given an array of strings words
and an integer maxWidth
, format the text so that:
- Each line has exactly
maxWidth
characters. - Lines are fully justified (left and right aligned).
- Extra spaces are distributed as evenly as possible.
- If the number of spaces does not divide evenly, assign more spaces to the left. . The last line must be left-justified.
π‘ Examples
Example 1
Input: words = ["This", "is", "an", "example", "of", "text", "justification."], maxWidth = 16
Output:
[
"This is an",
"example of text",
"justification. "
]
Example 2
Input: words = ["What","must","be","acknowledgment","shall","be"], maxWidth = 16
Output:
[
"What must be",
"acknowledgment ",
"shall be "
]
Example 3
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 "
]
π JavaScript Solution
Weβll use a greedy approach to pack as many words as possible into each line, then format the lines according to the rules.
Implementation
var fullJustify = function(words, maxWidth) {
const result = [];
let line = [];
let lineLength = 0;
for (let word of words) {
if (lineLength + word.length + line.length > maxWidth) {
result.push(justifyLine(line, lineLength, maxWidth));
line = [];
lineLength = 0;
}
line.push(word);
lineLength += word.length;
}
result.push(leftJustifyLine(line, maxWidth));
return result;
};
function justifyLine(line, lineLength, maxWidth) {
const spacesNeeded = maxWidth - lineLength;
const gaps = line.length - 1;
if (gaps === 0) {
return line[0] + ' '.repeat(spacesNeeded);
}
const spacePerGap = Math.floor(spacesNeeded / gaps);
const extraSpaces = spacesNeeded % gaps;
let justified = '';
for (let i = 0; i < line.length - 1; i++) {
justified += line[i] + ' '.repeat(spacePerGap + (i < extraSpaces ? 1 : 0));
}
justified += line[line.length - 1]; // Add the last word
return justified;
}
function leftJustifyLine(line, maxWidth) {
return line.join(' ') + ' '.repeat(maxWidth - line.join(' ').length);
}
π How It Works
-
Greedy Line Packing:
- Add words to the current line until adding another word exceeds maxWidth.
- Once the limit is reached, justify the current line and start a new one.
-
Justify Each Line:
- Middle Justification: Distribute spaces evenly across words, giving extra spaces to the left when needed.
- Left Justification (for the last line): Add spaces only at the end.
-
Output:
- Append the justified lines to the result.
π Complexity Analysis
- Time Complexity: O(n), where
n
is the total number of characters in the input.- Each word is processed once.
- Space calculations and string manipulations take O(1) per word.
- Space Complexity: O(n), for the output array of lines.
π Dry Run
Input: words = ["This", "is", "an", "example", "of", "text", "justification."]
, maxWidth = 16
[
"This is an",
"example of text",
"justification. "
]
β¨ Pro Tips for Interviews
-
Discuss Edge Cases:
- Single word input (
["word"]
). - Long words exceeding
maxWidth
. - Words perfectly filling the width.
- Single word input (
-
Explain Spacing Logic:
- Distribute spaces evenly across words.
- Handle leftover spaces by adding them to the left.
-
Follow Constraints:
- Ensure all lines are exactly
maxWidth
characters.
- Ensure all lines are exactly
π Learn More
Check out the detailed explanation and code walkthrough on my Dev.to post:
π Find the Index of the First Occurrence in a String - JavaScript Solution
How do you handle string manipulation challenges? Letβs discuss! π
Top comments (1)
Follow Me on GitHub π
If you found this solution helpful, check out more of my projects and solutions on my GitHub profile.
Don't forget to follow for more updates!