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 " ]
分析:
- 貪心的取單詞 line,直到 line 裝不下(單詞長度+空格數>maxWidth);
- 將 line 放入 lines;
- 解析 line ,分成最後一行,與非最後一行 解析;
- 非最後一行 又分成 單個單詞行 與 多個單詞行;
- 多個單詞行,則依次向前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]