LeetCode:68. Text Justification -Python

问题描述:

68. 文本左右对齐

给定一个单词数组和一个长度maxWidth,重新排版单词,使其成为每行恰好有maxWidth个字符,且左右两端对齐的文本。

你应该使用贪心算法来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格' '填充,使得每行恰好有maxWidth个字符。

要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。

文本的最后一行应为左对齐,且单词之间不插入额外的空格。

说明:

  • 单词是指由非空格字符组成的字符序列。
  • 每个单词的长度大于0,小于等于maxWidth
  • 输入单词数组words至少包含一个单词。

示例:
输入:

words = ["What","must","be","acknowledgment","shall","be"]
maxWidth = 16

输出:

[
  "What   must   be",
  "acknowledgment  ",
  "shall be        "
]

解释: 注意最后一行的格式应为 "shall be     " 而不是 “shall     be”,因为最后一行应为左对齐,而不是左右两端对齐。第二行同样为左对齐,这是因为这行只包含一个单词。

问题分析:

(1)使用贪心的思想,确定每一行文本,可以放下的单词,并按照规则,在这些单词之间均匀插入空格符。(要注意的一点是,每两个单子之前至少有一个空格符的)

(2)最后一行单独处理,因为最后一行要左对齐,后面的补充空格符。

Python3实现:

class Solution:
    def fullJustify(self, words, maxWidth):

        res = []  # 记录最终的结果
        cur = []  # 当前正在处理的行,可以容纳的单词列表
        cnt = 0  # 负责记录当前正在处理的行,所有的字符数

        for w in words:
            if cnt + len(w) + len(cur) > maxWidth:  # 超过了一行字符,则不再进行添加单词

                for i in range(maxWidth - cnt):  # 把剩余的空余,填充上空格,从左向右,一边一边的填充
                    cur[i % (len(cur)-1 or 1)] += ' '

                res.append(''.join(cur))  # 添加到 res 列表中
                cur, cnt = [], 0  # 恢复初始值

            cur += [w]  # 添加单词
            cnt += len(w)  # 统计字符数

        res.append(' '.join(cur).ljust(maxWidth))  # 最后一行特殊处理(左对齐),并添加到 res 列表

        return res


if __name__ == '__main__':
    words = ["Science", "is", "what", "we", "understand", "well", "enough", "to", "explain",
             "to", "a", "computer.", "Art", "is", "everything", "else", "we", "do"]
    maxWidth = 20
    solu = Solution()

    for s in solu.fullJustify(words, maxWidth):
        print(s)

声明: 总结学习,有问题或不妥之处,可以批评指正哦。

题目链接: leetcode-cn.com/problems/text-justification/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值