/*
* 68. Text Justification
* 2016-5-9 by Mingyang
* 首先是我的代码
*/
public List<String> fullJustify1(String[] words, int maxWidth) {
int start=0;
StringBuffer sb=new StringBuffer();
List<String> res=new ArrayList<String>();
while(start<words.length){
if(sb.toString().length()+words[start].length()>maxWidth){
res.add(alignment(sb,maxWidth));
sb=new StringBuffer();
start++;
}else{
sb.append(" ");
sb.append(words[start]);
start++;
}
}
if(sb.toString().length()!=0){
res.add(sb.toString());
}
return res;
}
public static String alignment(StringBuffer sb,int L){
String temp=sb.toString().trim();
String[] array=temp.split(" ");
int sum=0;
for(int i=0;i<array.length;i++){
sum+=array[i].length();
}
int space=(L-sum)/(array.length-1);
String re="";
while(space>0){
re=re+" ";
space--;
}
StringBuffer res=new StringBuffer();
for(int i=0;i<array.length;i++){
res.append(array[i]);
res.append(re);
}
String result=res.toString().trim();
if(result.length()<L){
sb.insert(0, " ");
}
return result;
}
/*
* 网上的代码
*/
public static ArrayList<String> fullJustify(String[] words, int L) {
ArrayList<String> res = new ArrayList<String>();
if (words == null || words.length == 0)
return res;
int count = 0;
int last = 0;
for (int i = 0; i < words.length; i++) {
// count是上一次计算的单词的长度,words[i].length()是当前尝试放的一个单词的长度,
// 假设当前放上了这个单词,那么这一行单词跟单词间的间隔数就是i-last
// 判断这些总的长度加起来是不是大于L(超行数了)
if (count + words[i].length() + (i - last) > L) {
int spaceNum = 0;
int extraNum = 0;
// 因为尝试的words[i]失败了,所以间隔数减1.此时判断剩余的间隔数是否大于0
if (i - last - 1 > 0) {
// 是间隔的倍数(为啥要减1,因为尝试当前words[i]后发现比L长了,
// 所以当前这个单词不能算作这行,所以间隔就减少一个
spaceNum = (L - count) / (i - last - 1);
extraNum = (L - count) % (i - last - 1);// 不是倍数的话还要计算
}
StringBuilder str = new StringBuilder();
for (int j = last; j < i; j++) {
str.append(words[j]);
if (j < i - 1) {// words[i-1]的话后面就不用填空格了,所以这里j<i-1
for (int k = 0; k < spaceNum; k++)
str.append(" ");
if (extraNum > 0)
str.append(" ");
extraNum--;
}
}
// 下面这个for循环作用于一行只有一个单词还没填满一行的情况
for (int j = str.length(); j < L; j++)
str.append(" ");
res.add(str.toString());
count = 0;
last = i;// 下一个开始的单词
}
count += words[i].length();
}
// 处理最后一行
StringBuilder str = new StringBuilder();
for (int i = last; i < words.length; i++) {
str.append(words[i]);
if (str.length() < L)
str.append(" ");
}
for (int i = str.length(); i < L; i++)
str.append(" ");
res.add(str.toString());
return res;
}