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

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

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

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

注意:

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

思路

  1. 先根据 maxWidth 分组,而后组内各自确定临界字符数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var fullJustify = function (words, maxWidth) {
const strs = []
let curGroup = [words[0]]
let curCount = words[0].length
for (let i = 1; i < words.length; ++i) {
const curWord = words[i]
if (curCount + curWord.length + 1 <= maxWidth) {
curGroup.push(curWord)
curCount += curWord.length + 1
continue
}
const items = curGroup
let curStr = items[0]
if (items.length === 1) {
curStr = items[0].padEnd(maxWidth, ' ')
} else {
const whiteCount = maxWidth - items.reduce((sum, cur) => sum + cur.length, 0)
const base = Math.floor(whiteCount / (items.length - 1))
const extras = whiteCount % (items.length - 1)
for (let i = 1; i <= extras; ++i) {
curStr += ' '.repeat(base + 1) + items[i]
}
for (let i = extras + 1; i < items.length; ++i) {
curStr += ' '.repeat(base) + items[i]
}
}
strs.push(curStr)

curGroup = [curWord]
curCount = curWord.length
}
strs.push(curGroup.join(' ').padEnd(maxWidth, ' '))
return strs
}