DEV Community

Cover image for LeetCode Challenge 68: Text Justification - JavaScript Solution πŸš€
Rahul Kumar Barnwal
Rahul Kumar Barnwal

Posted on

LeetCode Challenge 68: Text Justification - JavaScript Solution πŸš€

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:

  1. Each line has exactly maxWidth characters.
  2. Lines are fully justified (left and right aligned).
  3. 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.  "
]
Enter fullscreen mode Exit fullscreen mode

Example 2

Input: words = ["What","must","be","acknowledgment","shall","be"], maxWidth = 16  
Output:  
[
  "What   must   be",
  "acknowledgment  ",
  "shall be        "
]
Enter fullscreen mode Exit fullscreen mode

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                  "
]
Enter fullscreen mode Exit fullscreen mode

πŸ† 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);
}
Enter fullscreen mode Exit fullscreen mode

πŸ” How It Works

  1. 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.
  2. 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.
  3. 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

Text Justification
Output:

[
  "This    is    an",
  "example  of text",
  "justification.  "
]
Enter fullscreen mode Exit fullscreen mode

✨ Pro Tips for Interviews

  1. Discuss Edge Cases:

    • Single word input (["word"]).
    • Long words exceeding maxWidth.
    • Words perfectly filling the width.
  2. Explain Spacing Logic:

    • Distribute spaces evenly across words.
    • Handle leftover spaces by adding them to the left.
  3. Follow Constraints:

    • Ensure all lines are exactly maxWidth characters.

πŸ“š 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! πŸš€

JavaScript #LeetCode #CodingInterview #ProblemSolving

Top comments (1)

Collapse
 
rahulgithubweb profile image
Rahul Kumar Barnwal

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!