题目传送地址:https://leetcode.cn/problems/text-justification/
运行效率:
代码如下:
class Solution {
public static List<String> fullJustify(String[] words, int maxWidth) {
List<String> res = new ArrayList<>();
StringBuilder row = new StringBuilder();
for (int i = 0; i < words.length; i++) {
String word = words[i];
if (row.length() == 0) {
row.append(word);
continue;
}
if (row.length() + word.length() + 1 <= maxWidth) { //因为单词与单词之间需要加一个空格,所以这里要=1
row.append(" ").append(word);
} else {
res.add(row.toString());
row = new StringBuilder();
row.append(word);
}
}
if (!"".equals(row.toString())) {
res.add(row.toString());
}
List<String> result = fillList(res, maxWidth);
return result;
}
public static List<String> fillList(List<String> list, int maxWidth) {
List<String> res = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
//如果是最后一行 文本的最后一行应为左对齐,且单词之间不插入额外的空格。
if (i == list.size() - 1) {
int fillBlankNum = maxWidth - str.length();
StringBuilder stringBuilder = new StringBuilder(str);
while (fillBlankNum > 0) {
stringBuilder.append(" ");
fillBlankNum--;
}
res.add(stringBuilder.toString());
break;
}
int letterNum = getLetterNum(str);
//需要填充的空格数
int fillBlankNum = maxWidth - letterNum;
String[] strArray = str.split(" ");
//该行只有一个单词
if (strArray.length == 1) {
StringBuilder stringBuilder = new StringBuilder(strArray[0]);
while (fillBlankNum > 0) {
stringBuilder.append(" ");
fillBlankNum--;
}
res.add(stringBuilder.toString());
continue;
}
int avgBlankNum = fillBlankNum / (strArray.length - 1);//平均每两个单词之间应该保留的空格数
StringBuilder blank = new StringBuilder();
while (avgBlankNum > 0) {
blank.append(" ");
avgBlankNum--;
}
int moreBlankNum = fillBlankNum % (strArray.length - 1);//多出来的空格数
String join = String.join(blank, strArray);
StringBuilder stringBuilder = new StringBuilder(join);
int fromIndex = -1;
while (moreBlankNum > 0) {
int index = stringBuilder.indexOf(blank.toString(), fromIndex);
stringBuilder.insert(index, " ");
moreBlankNum--;
fromIndex =index+blank.length()+1;
}
res.add(stringBuilder.toString());
}
return res;
}
public static int getLetterNum(String str) {
int count = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) != ' ') {
count++;
}
}
return count;
}
}