问题描述:
给定一个单词数组和一个长度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)
声明: 总结学习,有问题或不妥之处,可以批评指正哦。