LeetCode题解(python)
68. 文本左右对齐
题目描述
给定一个单词数组和一个长度 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 "
]
解题心得
本题是在应用的基础上反过来制作的题。
基本解决思路是:
- 把每一行满足总长度(单词+空格)小于maxWidth的单词先确定
- 将每一行分别输入子函数,使用子函数分配空格,填满maxWidth的长度
KEY:
- 注意主程序中,ls1用于记录全部已经分好行的单词,其中的每个子列表代表了一行中应有的单词,ls2用于动态存储当前行应有的单词,c不仅要记录当前行的单词长度,还要相应的加每个单词对应一个空格
- 注意主程序中,如果最后剩下的单词不够maxWidth,要在ls1中的最后一个子列表中加上这行
- 子函数中,n表示当前行的单词的数量-1,也就是当前行中应有的空位的数量,比如3个单词之间有2个空位,4个单词之间有3个空位
- 子函数中,s表示本行中需要填充的空格的数量
- 子函数中,b表示每个空位需要填充的空格的数量,a表示填充完b*n个空格之后,还剩下的需要填充的空格的数量
- 子函数中,注意剩下的a个空格,需要从左到右尽量均匀分布,能分到几个空位就分到几个空位
ljust()
方法:Python ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。
- 例如:str.ljust(width[, fillchar])
解题代码
class Solution:
def fullJustify(self, words: List[str], maxWidth: int) -> List[str]:
c = 0
ls1,ls2 = [],[]
res = []
for word in words:
c = c+len(word)
if c==maxWidth:
ls2.append(word)
ls1.append(ls2)
ls2,c = [],0
continue
elif c<maxWidth:
ls2.append(word)
c = c+1
else:
ls1.append(ls2)
ls2 = [word]
c = len(word)+1
if ls2:
ls1.append(ls2)
print(ls1)
for i in range(len(ls1)-1):
s = self.justify(ls1[i],maxWidth)
res.append(s)
res.append(' '.join(ls1[-1]).ljust(maxWidth,' '))
return res
def justify(self,words,maxWidth):
if len(words) ==1:
return words[0].ljust(maxWidth,' ')
n = len(words) -1
s = maxWidth -len(''.join(words))
print('n',n)
print('s',s)
a,b = s%n,s//n
print(a,b)
space = [b]*n
for i in range(a):
space[i] = space[i]+1
res = words[0]
for i in range(n):
res = res+' '*space[i]+words[i+1]
return res