给定一个单词数组 words
和一个长度 maxWidth
,重新排版单词,使其成为每行恰好有 maxWidth
个字符,且左右两端对齐的文本。
你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ' '
填充,使得每行恰好有 maxWidth 个字符。
要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。
文本的最后一行应为左对齐,且单词之间不插入额外的空格。
注意:
- 单词是指由非空格字符组成的字符序列。
- 每个单词的长度大于 0,小于等于 maxWidth。
- 输入单词数组
words
至少包含一个单词。
示例 1:
输入: 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 " ]
提示:
1 <= words.length <= 300
1 <= words[i].length <= 20
words[i]
由小写英文字母和符号组成1 <= maxWidth <= 100
words[i].length <= maxWidth
步骤 1:问题定义和条件分析
本题要求给定一个单词数组 words
和一个最大宽度 maxWidth
,将单词重新排列,形成左右对齐的文本块,每行的宽度恰好等于 maxWidth
。具体要求为:
- 左右对齐:每行的字符宽度需要恰好为
maxWidth
。 - 单词间空格分布:每行内单词间的空格尽量均匀分布;如果无法完全均匀分配,左边的空格比右边多。
- 特殊行规则:最后一行需要左对齐,且单词间不需插入额外空格。
输入输出条件:
- 输入:
words
是包含单词的数组,1 <= words.length <= 300
,且每个单词长度1 <= words[i].length <= 20
。maxWidth
是每行的字符数,1 <= maxWidth <= 100
。
- 输出:
- 返回一个字符串列表,每个字符串代表排版后的每行内容。
边界条件:
- 所有单词恰好可以在一行显示。
- 单词个数较少或特别多时可能出现空格数量不均匀的情况。
- 每行的字符数需要恰好满足
maxWidth
,包括空格。
步骤 2:解决方案设计
我们采用贪心算法,逐行构建符合 maxWidth
宽度的字符串。解决思路分为以下步骤:
- 逐行放置单词:从
words
中尽可能多地取出单词来填充当前行,直至超过maxWidth
。 - 计算空格分布:
- 对于每行,计算放置的单词总长度,计算空格总数。
- 如果不是最后一行,将空格尽量均匀分布在单词之间,若有剩余空格则分配到前面的单词间。
- 处理特殊行:最后一行按左对齐规则排版,在单词之间不插入额外空格,右侧用空格填充至
maxWidth
。
时间复杂度:O(N)
- 我们遍历
words
数组,每个单词只处理一次,因此时间复杂度为 O(N),其中 N 为words
数量。
空间复杂度:O(N)
- 输出字符串的空间复杂度为 O(N),因为我们生成一个新的字符串列表。
步骤 3:代码实现
步骤 4:算法优化和启发
通过这个问题,我们可以看到贪心算法在空间分配、文本排版等问题中的适用性。贪心策略的优点是简单且效率高,能够迅速找到局部最优解。该方法在大规模文本或页面排版中非常适用,比如在 Web 排版、电子书格式化等领域,能有效提高排版速度和质量。
此外,该算法展示了如何处理边界情况,比如空格不均匀分布和多余空格填充问题,这对文字处理类算法有借鉴意义。
步骤 5:实际应用场景
在现代排版系统中,该算法有广泛的应用。例如:
示例应用:新闻内容管理系统 (CMS)
- 在新闻、社交媒体、网站上,将文章排版成对齐、阅读体验良好的段落尤为重要。
- 使用此算法可确保文章段落在屏幕或打印页上对齐,提升用户的阅读体验。具体实现时,系统可以根据用户设备或阅读偏好,调整
maxWidth
以适应不同分辨率的设备。
总结来看,这类文本对齐算法对于排版的精确控制非常重要,在内容展示与管理系统、电子书编辑软件中都能找到直接应用。