leetcode专题训练 68. Text Justification

这道题是一道大模拟题,不涉及到算法,主要就是要逻辑清晰。根据题目要求,可以知道这道题会涉及到两种单词对齐方式,一种是左对齐,一种是平铺对齐。了解到这点之后,就需要知道什么时候左对齐,什么时候平铺对齐。根据题意可知,在某行只有一个单词或者在最后一行的时候左对齐,其他时候都是平铺对齐,所以伪代码如下:

单词序列 =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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值