68. 文本左右对齐
题目
给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。
你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ’ ’ 填充,使得每行恰好有 maxWidth 个字符。
要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。
文本的最后一行应为左对齐,且单词之间不插入额外的空格。
注意:
单词是指由非空格字符组成的字符序列。
每个单词的长度大于 0,小于等于 maxWidth。
输入单词数组 words 至少包含一个单词。
示例 1:
输入: 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 "
]
提示:
1 <= words.length <= 300
1 <= words[i].length <= 20
words[i] 由小写英文字母和符号组成
1 <= maxWidth <= 100
words[i].length <= maxWidth
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/text-justification
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1. 遍历添加空格
class Solution(object):
def fullJustify(self, words, maxWidth):
"""
:type words: List[str]
:type maxWidth: int
:rtype: List[str]
"""
# 用以计数
c = 0
# 创建ans列表
ans = [[]]
# 遍历words列表
for i in words:
# 计数单词个数
c += len(i)
# 确保c不大于maxWidth 的情况下,添加上空格的大小
if c <= maxWidth :
ans[-1].append(i)
if c < maxWidth :
c+=1
# 如果c大于maxWidth ,开启新的一行重新计数
else:
ans.append([i])
c = len(i)
if c < maxWidth :
c+=1
# print(ans)
# result列表
res = []
for i in ans[:-1]:
s = "".join(i)
ls= len(s)
n = (maxWidth - ls)
if len(i) == 1:
i += " "*n
else:
while n > 0:
for j in range(len(i)-1):
if n == 0:
break
i[j] += " "
n -= 1
res.append("".join(i))
res.append(" ".join(ans[-1]))
# 补上最后一行
if len(res[-1])!=maxWidth :
res[-1]+=" "*(maxWidth -len(res[-1]))
# print(res)
return res
2. 先添加整数个数空格,再遍历添加
class Solution(object):
def fullJustify(self, words, maxWidth):
"""
:type words: List[str]
:type maxWidth: int
:rtype: List[str]
"""
# 用以计数
c = 0
# 创建ans列表
ans = [[]]
# 遍历words列表
for i in words:
# 计数单词个数
c += len(i)
# 确保c不大于maxWidth 的情况下,添加上空格的大小
if c <= maxWidth :
ans[-1].append(i)
if c < maxWidth :
c+=1
# 如果c大于maxWidth ,开启新的一行重新计数
else:
ans.append([i])
c = len(i)
if c < maxWidth :
c+=1
# print(ans)
# result列表
res = []
for i in ans[:-1]:
# 获取每行单词数量
ll = len(i)
# 获取每行初始大小
s = "".join(i)
# 实际的所有单词总长度
rel = len(s)
if (ll-1) == 0:
# 间隔需要填充空格的数量
n = (maxWidth - rel)
# 多余出来的空格
r = 0
else:
n = (maxWidth - rel) / (ll-1)
r = (maxWidth - rel) % (ll-1)
# print(n)
# print(r)
for j in range(ll):
i[j]+=(" "*n)
if r > 0:
i[j] += " "
r-=1
if len(i) != 1:
res.append("".join(i).strip())
else:
res.append("".join(i))
res.append(" ".join(ans[-1]))
# 补上最后一行
if len(res[-1])!=maxWidth :
res[-1]+=" "*(maxWidth -len(res[-1]))
# print(res)
return res