• 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                  "
    ]

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/text-justification

    class Solution:
        def fullJustify(self, words: List[str], maxWidth: int) -> List[str]:
            res=[]
            i=0
            while i < len(words):
                ii=i
                l=len(words[i])
                j=1#这一行的单词个数
                while i<len(words)-1 and l<=maxWidth:#贪心找最多,以相邻单词间隔1空格为标准
                    i+=1
                    j+=1
                    l=l+1+len(words[i])
                d=maxWidth-l
                if d<0:#超过maxWidth减去最后一个单词
                    i-=1
                    j-=1
                    l=l-len(words[i+1])-1
                    d=maxWidth-l
                if j==1:
                    w=words[ii]+' '*(maxWidth-len(words[ii]))
                elif i==len(words)-1:#最后一行为左对齐
                    w=''
                    for k in range(ii,ii+j):
                        if k<ii+j-1:
                            w+=words[k]+' '
                        else:
                            w+=words[k]
                    w+=' '*(maxWidth-len(w))
                else:
                    if d>0:#除相邻单词间隔1空格外还有剩余空格
                        if d%(j-1)==0:#剩余空格可均分
                            dd=d//(j-1)
                            w=''
                            for k in range(ii,ii+j):
                                if k<ii+j-1:
                                    w+=words[k]+' '*(dd+1)
                                else:
                                    w+=words[k]
                        else:#剩余空格不可均分
                            dd=d//(j-1)
                            ddd=d%(j-1)
                            w=''
                            for k in range(ii,ii+j):
                                if k<ii+ddd:
                                    w+=words[k]+' '*(dd+2)#均分后多余的往前面加
                                elif k<ii+j-1:
                                    w+=words[k]+' '*(dd+1)
                                else:
                                    w+=words[k]
                    else:#相邻单词刚好间隔1空格
                        w=''
                        for k in range(ii,ii+j):
                            if k<ii+j-1:
                                w+=words[k]+' '
                            else:
                                w+=words[k]
                res.append(w)
                i+=1
            return res
                
  • 相关阅读:
    第五周学习总结
    第四周学习总结
    第三周学习总结
    第二周学习总结
    读《程序是怎样跑起来的》第十二章有感
    读《程序是怎样跑起来的》第十一章有感
    读《程序是怎样跑起来的》第十章有感
    读《程序是怎样跑起来的》第九章有感
    《程序是怎样跑起来的》第九章
    《程序是怎样跑起来的》第八章
  • 原文地址:https://www.cnblogs.com/xxxsans/p/15249582.html
Copyright © 2020-2023  润新知