1. 程式人生 > >LeetCode 068 文字左右對齊(Text Justification) Python 解法

LeetCode 068 文字左右對齊(Text Justification) Python 解法

題目描述:

給定一個單詞陣列和一個長度 maxWidth,重新排版單詞,使其成為每行恰好有 maxWidth 個字元,且左右兩端對齊的文字。

你應該使用“貪心演算法”來放置給定的單詞;也就是說,儘可能多地往每行中放置單詞。必要時可用空格 ’ ’ 填充,使得每行恰好有 maxWidth 個字元。

要求儘可能均勻分配單詞間的空格數量。如果某一行單詞間的空格不能均勻分配,則左側放置的空格數要多於右側的空格數。

文字的最後一行應為左對齊,且單詞之間不插入額外的空格。

說明:

單詞是指由非空格字元組成的字元序列。 每個單詞的長度大於 0,小於等於 maxWidth。 輸入單詞陣列 words 至少包含一個單詞。 示例:

輸入: words = [“This”, “is”, “an”, “example”, “of”, “text”, “justification.”] maxWidth = 16 輸出: [ “This is an”, “example of text”, "justification. " ] 示例 2:

輸入: words = [“What”,“must”,“be”,“acknowledgment”,“shall”,“be”] maxWidth = 16 輸出: [ “What must be”, "acknowledgment ", "shall be " ] 解釋: 注意最後一行的格式應為 "shall be " 而不是 “shall be”, 因為最後一行應為左對齊,而不是左右兩端對齊。 第二行同樣為左對齊,這是因為這行只包含一個單詞。 示例 3:

輸入: words = [“Science”,“is”,“what”,“we”,“understand”,“well”,“enough”,“to”,“explain”, “to”,“a”,“computer.”,“Art”,“is”,“everything”,“else”,“we”,“do”] maxWidth = 20 輸出: [ “Science is what we”, “understand well”, “enough to explain to”, “a computer. Art is”, “everything else we”, "do " ]

分析:

  1. 貪心的取單詞 line,直到 line 裝不下(單詞長度+空格數>maxWidth);
  2. 將 line 放入 lines;
  3. 解析 line ,分成最後一行,與非最後一行 解析;
  4. 非最後一行 又分成 單個單詞行多個單詞行
  5. 多個單詞行,則依次向前N-1個單詞後面插入空格,(這樣保證空格均勻分佈,左邊空格大於右邊一格)直到長度等於maxWidth。

解法:

class Solution(object):
    def fullJustify(self, words, maxWidth):
        """
        :type words: List[str]
        :type maxWidth: int
        :rtype: List[str]
        """
        line = []
        lines = [] 
        length_used = 0
        
        for word in words:
            # 貪心的拿取單詞
            if length_used + len(word) <= maxWidth:
                line.append(word)
                length_used += len(word)+1
            # 單詞拿不下的時候,把 line 裝進 lines,並把line 清空把最後的單詞放進去,開始新的一輪
            else:
                lines.append(line)
                line = [word]
                length_used = len(word)+1
                
        # 最後一行裝進lines中        
        lines.append(line)    
        
        
        # 處理前N-1行
        for line in lines[:-1]:
            l = sum(len(word) for word in line)
            # 只有一個單詞的特殊情況
            if len(line)==1:
                line[0] = line[0] + ' '*(maxWidth-l)
            # 至少兩個單詞,則按次序向前N-1個單詞後面插入空格,直到長度等於所需
            else:    
                while l != maxWidth:
                    for i in range(len(line)-1):
                        line[i] = line[i] + ' '
                        l += 1
                        if l == maxWidth:
                            break
        # 單獨處理最後一行                
        s = ' '.join(lines[-1])
        if len(s) < maxWidth:
            s = s + " "*(maxWidth-len(s))
            
        return [''.join(line) for line in lines[:-1]] + [s]