# 题目: 68. 文本左右对齐

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

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

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

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

# 示例 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",
     因为最后一行应为左对齐,而不是左右两端对齐。       
     第二行同样为左对齐,这是因为这行只包含一个单词。

# 题解: 模拟

  1. 计算每一行可容纳的最大单词数,然后计算空格进行平均分配,多出来的平均到前面的单词间隔中
  2. 只有一个单词数时,左对齐
  3. 最后一行时,左对齐

# 代码

/**
 * @param {string[]} words
 * @param {number} maxWidth
 * @return {string[]}
 */
var fullJustify = function(words, maxWidth) {
    const ans = []
    let right=0, n  = words.length;
    while(true){
        // 单词的位置
        let left = right;
        let rowLength = 0;
        // right - left 空格间隔数
        while(right<n && rowLength + words[right].length + right -left <=maxWidth){
            rowLength += words[right].length
            right++
        }
        // 当前为最后一行 单词位置为 n
        if(right === n) {
            // 左对齐
            let s = words.slice(left).join(' ')
            ans.push(s + black(maxWidth - s.length))
            return ans
        }
        const  wordNum = right - left

        const spaceNum = maxWidth - rowLength
        // 当只有一个单词
        if(wordNum === 1){
            ans.push(words[left]+ black(spaceNum))
            continue
        }
        // 填充空格
        const avgSpace = Math.floor(spaceNum/(wordNum-1))
        const extraSpace = spaceNum%(wordNum-1)
        const s1 = words.slice(left,left+extraSpace+1).join(black(avgSpace+1))
        const s2 = words.slice(left+extraSpace+1,right).join(black(avgSpace))
        ans.push(s1+black(avgSpace)+s2)
    }

};

const black = function(n){
    return new Array(n).fill(' ').join('')
}

# 参考资料

  1. 68. 文本左右对齐 (opens new window)
  2. 官方题解 (opens new window)