LC 0068 [H] Text Justification - ALawliet/algorithms GitHub Wiki

class Solution:
    def fullJustify(self, words: List[str], maxWidth: int) -> List[str]:
        res = []
        
        i = 0
        width = 0
        line = []
        
        while i < len(words): # so we can increment i to move to next word when ready
            word = words[i]
            
            if width + len(word) <= maxWidth: # word fits in line
                line.append(word)
                width += len(word) + 1 # include at least 1 space after each word
                i += 1 # move on to next word

            else: # done with words for a line, now justify spaces
                spaces = maxWidth - width + len(line) # number of spaces to add to fill up the line

                added = 0
                j = 0 # increment j to move to next word

                while added < spaces:
                    if j >= len(line) - 1:
                        j = 0        

                    line[j] += " " # add to the end of a word

                    added += 1
                    j += 1

                res.append("".join(line))
                line = [] # reset for next line
                width = 0
            
        # last line remains when loop exits, so handle it separately
        for word in range(len(line) - 1):
            line[word] += " " # at least 1 space between words
        line[-1] += " " * (maxWidth - width + 1) # +1 for the extra space above, remaining spaces to fill up the rest of the line, justify left, so just add spaces to right of last word
        res.append("".join(line))
        
        return res