# Hard-题目52：68. Text Justification

93人阅读 评论(0)

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的空格方式，正常的每个单词空一格就好，最后留白就好

1. 比如这行有6个空格，4个间隔，那么左1，左2的空格长度为2。这个自己是取模然后作为remain传递，这样知道补几次extra space。
2. 最后一行如果有两个以上单词，则间隔为1，在末尾补空格。

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

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(' ');
}
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--;
}
}

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]);
}
}
}

1ms,33.42%,1ms,66.58%

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：57007次
• 积分：3213
• 等级：
• 排名：第10664名
• 原创：270篇
• 转载：53篇
• 译文：0篇
• 评论：7条
文章分类
最新评论