这道题是一道大模拟题,不涉及到算法,主要就是要逻辑清晰。根据题目要求,可以知道这道题会涉及到两种单词对齐方式,一种是左对齐,一种是平铺对齐。了解到这点之后,就需要知道什么时候左对齐,什么时候平铺对齐。根据题意可知,在某行只有一个单词或者在最后一行的时候左对齐,其他时候都是平铺对齐,所以伪代码如下:
单词序列 = 空
for 单词 in 单词列表
将单词加入单词序列
if 当前单词序列足够组成一行
if 当前单词序列中只有一个单词
左对齐
else
平铺对齐
end
单词序列 = 空
end
end
if 单词序列中有剩余单词 // 最后一行
左对齐
end
接下来就是用代码语言表示上面的伪代码,需要具体展开的部分有单词序列的表示,当前单词序列足够构成一行,左对齐和平铺对齐。
- 单词序列:list[str]
- 当前单词序列足够构成一行:若单词序列中的单词索引从begini到(i-1),那么如果往单词序列中加入单词i会使得当前行超过maxWidth,就说明从begini到(i-1)的单词序列足够构成了一行。也就是lnow+len(words[i])+(i-begini) > maxWidth,就说明当前的单词序列足够构成一行。其中lnow是从begini到(i-1)的所有单词的长度总和,words[i]是第i个单词,(i-begini)是如果该行由单词begini到i组成,空格最少个数(相邻单词之间一个空格)。(注:由于是通过单词i判断当前的序列,所以单词i要在判断完之后再加入单词序列,完整代码中对伪代码中此部分有改动)
- 左对齐:
用python中的join函数用空格连接单词序列中单词。如果连接好之后,不到maxWidth,那么就用空格继续补全。 - 平铺对齐:
由于单词之间的空格大小可能不平均,且由题意,左边的空格大小比右边空格大小大,所以先计算出较大的空格数Mblank,然后计算出较小的空格的长度,blank1是较小长度的空格,blank2是较长长度的空格。之后再用join函数,对前Mblank单词用blank2进行连接,对第Mblank单词到最后一个单词用blank1进行连接,之后将这两部分连接起来即可。需要注意的是,由于Mblank单词重复了,所以要切片切掉前部分或后部分的一个Mblank单词,在本代码中切了后部分的单词。
完整代码:
class Solution:
def LeftJustified(self, words: List[str], maxWidth: int) -> str: # left-justified
tmp = " ".join(words)
l = len(tmp)
while l < maxWidth:
tmp += " "
l += 1
return tmp
def FullyJustified(self, words: List[str], maxWidth: int, NumBlank: int, lnow: int) -> str: # fully-justified
Mblank = (maxWidth-lnow)%NumBlank # #longer blank
# print(Mblank, NumBlank)
blank = (maxWidth-lnow)//NumBlank
blank1 = "".join([" " for j in range(blank)]) # normal blank
blank2 = blank1+" " # longer blank
tmp1 = blank2.join(words[:(Mblank+1)])
tmp2 = blank1.join(words[Mblank:])
return tmp1+tmp2[len(words[Mblank]):] # delete the overlap part
def fullJustify(self, words: List[str], maxWidth: int) -> List[str]:
begini = 0
lnow = 0
result = []
for i in range(len(words)):
word = words[i]
if lnow+len(word)+(i-begini) > maxWidth: # add one word will make the width longer than maxWidth
NumBlank = i-begini-1
tmp = ""
if NumBlank == 0:
tmp = self.LeftJustified(words[begini:begini+1], maxWidth)
else:
tmp = self.FullyJustified(words[begini:i], maxWidth, NumBlank, lnow)
result.append(tmp)
begini = i
lnow = len(word)
else:
lnow += len(word)
result.append(self.LeftJustified(words[begini:], maxWidth))
return result