LeetCode:68. Text Justification -Python
阿新 • • 發佈:2018-12-22
問題描述:
給定一個單詞陣列和一個長度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)
宣告: 總結學習,有問題或不妥之處,可以批評指正哦。