Hard-题目52:68. Text Justification

题目原文:
Given an array of words and a length L, format the text such that each line has exactly L characters and is fully (left and right) justified.
You should pack your words in a greedy approach; that is, pack as many words as you can in each line. Pad extra spaces ’ ’ when necessary so that each line has exactly L characters.
Extra spaces between words should be distributed as evenly as possible. If the number of spaces on a line do not divide evenly between words, the empty slots on the left will be assigned more spaces than the slots on the right.
For the last line of text, it should be left justified and no extra space is inserted between words.
For example,
words: [“This”, “is”, “an”, “example”, “of”, “text”, “justification.”]
L: 16.
Return the formatted lines as:
[
“This is an”,
“example of text”,
“justification. ”
]
Note: Each word is guaranteed not to exceed L in length.
题目大意:
题目的大意就是对一个字符串数组进行格式化调整,输出对应的句子。
要求有:
1、每一行的字符串长度不能超过一个固定长度maxWidth
2、每两个单词之间必须有一个空格,如果一行之间的单词之间空格不能细分,那么必须左边的空格多,右边的少。并且,空格多的地方只比右边少的多一个
3、最后一行不适用2的空格方式,正常的每个单词空一格就好,最后留白就好
题目分析:
每次maxWidth都要减去当前单词的长度,再减一。这是找每一行。跳出条件为i超出数组元素,或者当前行位置已经不足。
自己维护两个变量, start和end来判断当前这行的开始单词和结束单词。并根据这两个元素来判断有多少个间隔。
还需要注意的地方有两个:
1. 比如这行有6个空格,4个间隔,那么左1,左2的空格长度为2。这个自己是取模然后作为remain传递,这样知道补几次extra space。
2. 最后一行如果有两个以上单词,则间隔为1,在末尾补空格。
源码:(language:java)

public class Solution {
    public List<String> fullJustify(String[] words, int maxWidth) {
        List<String> res = new ArrayList<String>();
        if(words == null || words.length==0){
            res.add(""); return res;
        }

        int i = 0;

        while(true){
            int c1 = maxWidth; int wordLen = 0; int start = i;

            while(i<=words.length-1 && c1>=words[i].length()){
                wordLen += words[i].length();
                c1=c1-words[i++].length(); c1--;
            }

            int end = i-1; 

            if(i!=words.length){ // c1 < next word length
                if(end==start){
                    placeRes(res, words, start, end, 0, maxWidth - wordLen); continue;
                }
                int space = (maxWidth - wordLen)/(end - start);
                placeRes(res, words, start, end, (maxWidth - wordLen)%(end - start), space);
            }else{ // last line
                if(end==start){ 
                    // one word
                    placeRes(res, words, start, end, 0, maxWidth - wordLen);

                }else{ 
                    // "shall be. "
                    StringBuilder sb = new StringBuilder(maxWidth);
                    for(; start<end; start++){
                        sb.append(words[start]); sb.append(' ');
                    }
                    sb.append(words[start]);
                    while(sb.length()!=maxWidth) sb.append(' ');
                    res.add(sb.toString());
                }
                return res;
            }
        }
    }

    void placeRes(List<String> res, String[] words, int start, int end, int remain, int spaceLen){
        StringBuilder sb = new StringBuilder(); sb.append(words[start]);
        if(end==start){
                while(spaceLen>0){
                    sb.append(' '); spaceLen--;
                }
            res.add(sb.toString()); return;
        }

        for(int i=start+1; i<=end; i++){
            for(int j=0; j<spaceLen; j++) sb.append(' '); 
            if(remain-->0) sb.append(' ');
            sb.append(words[i]);
        }
        res.add(sb.toString()); return;
    }
}

成绩:
1ms,33.42%,1ms,66.58%

你可能感兴趣的:(Hard-题目52:68. Text Justification)