Участник:ArthurSamuelyan/Text Justification

Материал из DISCOPAL
Перейти к: навигация, поиск
class Solution(object):
    def fullJustify(self, words, maxWidth):
        """
        :type words: List[str]
        :type maxWidth: int
        :rtype: List[str]
        """
        wordSacks = self.splitWords(words, maxWidth)
        textJustified = [self.lineJustify(words, maxWidth) for words in wordSacks[:-1]]
        textJustified += [self.lineJustifyLeft(wordSacks[-1], maxWidth)]
        return textJustified
 
 
    # Раскладываем солва по "мешкам" - 
    # каждый "мешок" строке финального текста
    def splitWords(self, words, maxWidth):
        wordSacks = []
        lenPrev = 0
        lenNew = 0
        for w in words:
            if lenPrev == 0:
                # Создаем новый "мешок",
                # если ничего еще не было сложено
                lenPrev = len(w)
                lenNew = lenPrev
                wordSacks.append([w])
 
            else:
                # Так как хотя бы по одному пробелу
                # между словами поставить обязательно,
                # учитываем их длину
                lenNew = lenPrev + len(w) + 1
                if lenNew > maxWidth:
                    # Создаем новый "мещок",
                    # если слово не поместилось в предыдущий
                    lenPrev = len(w)
                    lenNew = lenPrev
                    wordSacks.append([w])
 
                else:
                    # Если помещается,
                    # складываем слово в последний "мешок"
                    lenPrev = lenNew
                    wordSacks[-1].append(w)
 
        return wordSacks
 
 
    def lineJustify(self, lineWords, maxWidth):
        # Для единственного слова в строке применяется левое выравнивание
        if (len(lineWords) == 1):
            return self.lineJustifyLeft(lineWords, maxWidth)
 
        totalLen = sum([len(w)+1 for w in lineWords]) - 1
        extraSpaces = maxWidth - totalLen
        spacePlaces = len(lineWords) - 1
        regSpace = "".join([" " for _ in range(extraSpaces / spacePlaces)])
        bigSpace = "".join([regSpace, " "])
        for i in range(spacePlaces):
            if i < extraSpaces % spacePlaces:
                lineWords[i] = "".join([lineWords[i], bigSpace])
 
            else:
                lineWords[i] = "".join([lineWords[i], regSpace])
 
        line = " ".join(lineWords)
        return line
 
 
    # Used for the last line
    def lineJustifyLeft(self, lineWords, maxWidth):
        totalLen = sum([len(w) for w in lineWords])
        extraSpaces = maxWidth - totalLen - (len(lineWords) - 1)
        line = "".join([" ".join(lineWords)] + ["".join([" " for _ in range(extraSpaces)])])
        return line