Text Justification
String
Hard
Solution & Analysis
@Grandyang 将这道题翻译为文本的左右对齐是因为这道题像极了word软件里面的文本左右对齐功能
这题没有很神秘的算法或者数据结构,难点在于如何分析清楚细节和特殊情况。
实现方法参考:
@mnmunknown
https://mnmunknown.gitbooks.io/algorithm-notes/628,_linkedin_mian_jing_ti.html
public class Solution {
public List<String> fullJustify(String[] words, int maxWidth) {
List<String> list = new ArrayList<String>();
int N = words.length;
int right = 0;
for(int left = 0; left < N; left = right){
// Each word comes with one space;
// Except the first word, so start with -1.
int len = -1;
for(right = left; right < N && len + words[right].length() + 1 <= maxWidth; right ++){
len += words[right].length() + 1;
}
// Those are in case there's only one word picked, or in last line
int space = 1;
int extra = 0;
if(right != left + 1 && right != N){
// right - left - 1 is number of gaps
space = (maxWidth - len) / (right - left - 1) + 1;
extra = (maxWidth - len) % (right - left - 1);
}
StringBuilder sb = new StringBuilder(words[left]);
for(int i = left + 1; i < right; i++){
for(int j = 0; j < space; j++) sb.append(' ');
if(extra-- > 0) sb.append(' ');
sb.append(words[i]);
}
int rightSpace = maxWidth - sb.length();
while(rightSpace-- > 0) sb.append(' ');
list.add(sb.toString());
}
return list;
}
}
@programcreek
https://www.programcreek.com/2014/05/leetcode-text-justification-java/
There is not a special algorithm required to solve this problem. To correctly solve this problem, the following situations should be taken care of:
if a line has only one word and the word's length is less than max width, we need to fill the left part with spaces.
how to distribute extra spaces for each words when the number of spaces can not be evenly distributed to each word.
public List<String> fullJustify(String[] words, int maxWidth) {
List<String> result = new ArrayList<String>();
if(words==null || words.length==0){
return result;
}
int count=0;
int last=0;
ArrayList<String> list = new ArrayList<String>();
for(int i=0; i<words.length; i++){
count = count + words[i].length();
if(count+i-last>maxWidth){
int wordsLen = count-words[i].length();
int spaceLen = maxWidth-wordsLen;
int eachLen = 1;
int extraLen = 0;
if(i-last-1>0){
eachLen = spaceLen/(i-last-1);
extraLen = spaceLen%(i-last-1);
}
StringBuilder sb = new StringBuilder();
for(int k=last; k<i-1; k++){
sb.append(words[k]);
int ce = 0;
while(ce<eachLen){
sb.append(" ");
ce++;
}
if(extraLen>0){
sb.append(" ");
extraLen--;
}
}
sb.append(words[i-1]);//last words in the line
//if only one word in this line, need to fill left with space
while(sb.length()<maxWidth){
sb.append(" ");
}
result.add(sb.toString());
last = i;
count=words[i].length();
}
}
int lastLen = 0;
StringBuilder sb = new StringBuilder();
for(int i=last; i<words.length-1; i++){
count = count+words[i].length();
sb.append(words[i]+" ");
}
sb.append(words[words.length-1]);
int d=0;
while(sb.length()<maxWidth){
sb.append(" ");
}
result.add(sb.toString());
return result;
}
Reference
@Grandyang [LeetCode] Text Justification 文本左右对齐
Last updated
Was this helpful?