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]Text Justification(java)

问题描述: Given an array of words and a length L, format the text such that each line has exactly L cha...
  • zdavb
  • zdavb
  • 2015年08月04日 11:20
  • 457

[leetcode] 68. Text Justification

Given an array of words and a length L, format the text such that each line has exactly L characters...
  • TstsUgeg
  • TstsUgeg
  • 2016年04月21日 16:11
  • 474

LeetCode68——Text Justification

LeetCode68——Text Justification 也是相当恶心的一道题,倒不是有多难,还是不知道他的边界条件是怎么样的,所以也是经过多次的提交取改进代码,最后通过。 就不细说了,代码: c...
  • zhangxiao93
  • zhangxiao93
  • 2015年11月02日 10:34
  • 313

LeetCode 68. Text Justification(文本对齐)

原题网址:https://leetcode.com/problems/text-justification/ Given an array of words and a length L, for...
  • jmspan
  • jmspan
  • 2016年05月22日 00:05
  • 256

LeetCode||68. Text Justification

Given an array of words and a length L, format the text such that each line has exactly L characters...
  • Lingfu74
  • Lingfu74
  • 2017年12月04日 15:18
  • 22

LeetCode | 68. Text Justification

Given an array of words and a length L, format the text such that each line has exactly L characters...
  • pku_Coder
  • pku_Coder
  • 2017年07月31日 00:21
  • 152

68. Text Justification

真是惭愧,这道题一点也不难,当时只是觉得这道题目比较麻烦,于是畏难不前,结果拖了两天的时间。要解决这道题,需要注意两点:a、当前行只放一个单词时,空格全部在这个单词的右边 b、最后一行,单词间只有一个...
  • wusecaiyun
  • wusecaiyun
  • 2015年08月02日 18:34
  • 452

leetcode 68. Text Justification

Given an array of words and a length L, format the text such that each line has exactly L characters...
  • tinkle181129
  • tinkle181129
  • 2016年06月29日 17:16
  • 124

Leetcode 68. Text Justification

68. Text Justification Total Accepted: 32775 Total Submissions: 202667 Difficulty: Hard Given...
  • fantasiasango
  • fantasiasango
  • 2016年05月02日 07:10
  • 268

LeetCode 68. Text Justification

写的不好看,下次改进了。
  • u014674776
  • u014674776
  • 2014年07月12日 05:53
  • 602
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hard-题目52:68. Text Justification
举报原因:
原因补充:

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