Hard-题目52:68. Text Justification

转载 2016年05月31日 23:58:22

题目原文:
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%

[Leetcode 68, Hard] Text Justification

[Leetcode 68, Hard] Text Justification

[leetcode]68. Text Justification@Java解题报告

https://leetcode.com/problems/text-justification/#/description Given an array of word...

[LeetCode] 68. Text Justification

LeetCode

[leetcode] 68. Text Justification 解题报告

题目链接: https://leetcode.com/problems/text-justification/ Given an array of words and a length L, fo...

LeetCode 68 -Text Justification

Text Justification Given an array of words and a length L, format the text such that each line has...
  • ywcpig
  • ywcpig
  • 2016年10月17日 21:10
  • 398

【LeetCode】68. Text Justification

题目描述Given an array of words and a length L, format the text such that each line has exactly L charac...

[LeetCode]68. Text Justification 深入浅出讲解和代码示例

本题涵盖了归一化的解题思路。

LeetCode 68 Text Justification(Python详解及实现)

【题目】 Given an array of words and a length L,format the text such that each line has exactly L chara...

Leetcode 68. Text Justification (Airbnb面试题,字符串处理,边界条件)

Leetcode 68. Text Justification (Airbnb面试题,字符串处理,边界条件)

LeetCode-68.Text Justification

https://leetcode.com/problems/text-justification/ Given an array of words and a length L, forma...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hard-题目52:68. Text Justification
举报原因:
原因补充:

(最多只允许输入30个字)