68.文本左右对齐

给定一个单词数组和一个长度 maxWidth,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。
尽可能多地往每行中放置单词,要求均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。
文本的最后一行应为左对齐,且单词之间不插入额外的空格。

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

示例:
输入:
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                  "
]

class Solution {
    public List<String> fullJustify(String[] words, int maxWidth) {
    	//一行单词数量
        int wordsCountPerRow = 0;
        //一行单词长度(不包括空格)
        int wordsWidth = 0;
        //存放一行单词
        String[] wordsArr = new String[words.length];
        //下标
		int wordsArrIndex = 0;
		//对齐的文本
        String row = new String();
        List<String> strList = new ArrayList<>();
        //从左向右遍历单词
        for(int i = 0; i < words.length; i++) {
        	//判断添加下一个单词长度是否超出限制(加上两单词间至少的一个空格)
            boolean isMax = wordsWidth + words[i].length() + wordsCountPerRow > maxWidth;
            //不超出
            if(!isMax) {
                wordsCountPerRow++;
                wordsWidth += words[i].length();
                wordsArr[wordsArrIndex++] = words[i];
            }
            //超出 或 添加了最后一个单词
            if(isMax || i==words.length-1) {
            	//保证能遍历到这次添加会超出限制的单词
                if(isMax)
                    i--;
                //对齐文本
                for(int j = 0; j < wordsCountPerRow; j++) {
                    row += wordsArr[j];
                    //一个单词为一行 或 最后一行 文本
                    //除了最后一个单词,每个单词后添加一个空格
                    if(1==wordsCountPerRow || i==words.length-1) {
                        if(j != wordsCountPerRow-1)
                            row += " ";
                    //常规情况
                    //除了最后一个单词,每个单词后均分空格
                    } else {
                        if(j != wordsCountPerRow-1) {
                        	//平均空格数
                            int temp1 = (maxWidth - wordsWidth) / (wordsCountPerRow - 1);
                            //均分空格后剩余的空格数
                            int temp2 = maxWidth - (wordsWidth + ((wordsCountPerRow - 1) * temp1));
                            //添加均分的空格
                            for(int k = 0; k < temp1; k++)
                                row += " ";
                            //从左向右将剩余空格逐个添加于每个单词后
                            if(j < temp2)
                                row += " ";
                        }
                    }
                }
                //在 一个单词为一行 或 最后一行 的文本尾部补满空格
                int temp = maxWidth - row.length();
                for(int j = 0; j < temp; j++)
                    row += " ";
                
                wordsCountPerRow = 0;
                wordsWidth = 0;
				wordsArrIndex = 0;
                strList.add(row);
                row = new String();
            }
        }
        return strList;
    }
}

你可能感兴趣的:(力扣,leetcode,java)