题目描述:
给定一个单词数组和一个长度 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]