1. 程式人生 > >LeetCode:68. Text Justification -Python

LeetCode:68. Text Justification -Python

問題描述:

68. 文字左右對齊

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

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

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

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

說明:

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

示例:
輸入:

words = ["What","must","be","acknowledgment","shall","be"]
maxWidth = 16

輸出:

[
  "What   must   be",
  "acknowledgment  ",
  "shall be        "
]

解釋: 注意最後一行的格式應為 "shall be     " 而不是 “shall     be”,因為最後一行應為左對齊,而不是左右兩端對齊。第二行同樣為左對齊,這是因為這行只包含一個單詞。

問題分析:

(1)使用貪心的思想,確定每一行文字,可以放下的單詞,並按照規則,在這些單詞之間均勻插入空格符。(要注意

的一點是,每兩個單子之前至少有一個空格符的)

(2)最後一行單獨處理,因為最後一行要左對齊,後面的補充空格符。

Python3實現:

class Solution:
    def fullJustify(self, words, maxWidth):

        res = []  # 記錄最終的結果
        cur = []  # 當前正在處理的行,可以容納的單詞列表
        cnt = 0  # 負責記錄當前正在處理的行,所有的字元數

        for w in words:
            if cnt + len(w) + len(cur) >
maxWidth: # 超過了一行字元,則不再進行新增單詞 for i in range(maxWidth - cnt): # 把剩餘的空餘,填充上空格,從左向右,一邊一邊的填充 cur[i % (len(cur)-1 or 1)] += ' ' res.append(''.join(cur)) # 新增到 res 列表中 cur, cnt = [], 0 # 恢復初始值 cur += [w] # 新增單詞 cnt += len(w) # 統計字元數 res.append(' '.join(cur).ljust(maxWidth)) # 最後一行特殊處理(左對齊),並新增到 res 列表 return res if __name__ == '__main__': words = ["Science", "is", "what", "we", "understand", "well", "enough", "to", "explain", "to", "a", "computer.", "Art", "is", "everything", "else", "we", "do"] maxWidth = 20 solu = Solution() for s in solu.fullJustify(words, maxWidth): print(s)

宣告: 總結學習,有問題或不妥之處,可以批評指正哦。