[leetcode]Text Justification
这道题果然不容易写对啊。首先为了写对,我写完以后对着代码又检查了一阵,挺好,而且发现自己偶尔写点注释也便于自己理解。
然后居然超时了,主要原因就是计算长度为n的空字符串花时间太多,就用了个数组一开始先算好存起来。这里用new String[L+1]主要为了避免L为0的情况。
public class Solution {
public ArrayList<String> fullJustify(String[] words, int L) {
// Start typing your Java solution below
// DO NOT write main() function
ArrayList<String> result = new ArrayList<String>();
String[] spaces = new String[L+1];
StringBuilder builder = new StringBuilder();
for (int i = 0; i < L+1; i++) {
spaces[i] = builder.toString();
builder.append(' ');
}
int len = words.length;
int i = 0;
while (i < len) {
int j = i;
int total = words[i].length();
while (true) {
j++;
if (j == len) break;
int w = words[j].length();
if (total + w + 1 > L) break;
total += w + 1;
}
int left = L - total;
int c = j - i;
if (c == 1) { // single word
StringBuilder sb = new StringBuilder(words[i]);
sb.append(spaces[left]);
result.add(sb.toString());
}
else { // multi-word
if (j == len) { // last line
StringBuilder sb = new StringBuilder(words[i]);
for (int x = i+1; x < j; x++) {
sb.append(' ');
sb.append(words[x]);
}
sb.append(spaces[left]);
result.add(sb.toString());
}
else {
int k = left / (c - 1); // extra ' ' for every gap
int l = left - k * (c - 1); // count for first gaps with extra ''
StringBuilder sb = new StringBuilder(words[i]);
for (int x = i+1; x < j; x++) {
if (l > 0) {
sb.append(' ');
l--;
}
sb.append(' ');
sb.append(spaces[k]);
sb.append(words[x]);
}
result.add(sb.toString());
}
}
i = j;
}
return result;
}
}

浙公网安备 33010602011771号