给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。
你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ‘ ‘ 填充,使得每行恰好有 maxWidth 个字符。
要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。
文本的最后一行应为左对齐,且单词之间不插入额外的空格。
注意:
- 单词是指由非空格字符组成的字符序列。
- 每个单词的长度大于 0,小于等于 maxWidth。
- 输入单词数组 words 至少包含一个单词。
思路
- 先根据 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 }
|