Leetcode——文本左右对齐
Posted Yawn,
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode——文本左右对齐相关的知识,希望对你有一定的参考价值。
1. 文本左右对齐
(1)暴力模拟
- 如果当前行只有一个单词,特殊处理为左对齐;
- 如果当前行为最后一行,特殊处理为左对齐;
- 其余为一般情况,分别计算「当前行单词总长度」、「当前行空格总长度」和「往下取整后的单位空格长度」,然后依次进行拼接。
- 当空格无法均分时,每次往靠左的间隙多添加一个空格,直到剩余的空格能够被后面的间隙所均分。
class Solution {
public List<String> fullJustify(String[] words, int maxWidth) {
List<String> res = new ArrayList<>();
List<String> list = new ArrayList<>();
int len = words.length;
int index = 0;
while (index < len) {
//list存放当前行所有word
list.clear();
list.add(words[index]);
int curLen = words[index].length();
index++;
//当前单词长度 + 空格 + 下一单词长度 < maxWidth
while (index < len && curLen + 1 + words[index].length() <= maxWidth) {
curLen = curLen + 1 + words[index].length();
list.add(words[index]);
index++;
}
//当前行为最后一行,特殊处理左对齐
if (index == len) {
StringBuilder sb = new StringBuilder(list.get(0));
for (int k = 1; k < list.size(); k++) {
sb.append(" ").append(list.get(k));
}
while (sb.length() < maxWidth)
sb.append(" ");
res.add(sb.toString());
break;
}
//如果当前行只有一个 word,特殊处理为左对齐
int count = list.size();
if (count == 1) {
String str = list.get(0);
while (str.length() != maxWidth)
str += " ";
res.add(str);
continue;
}
/**
* 其余为一般情况
* wordWidth : 当前行单词总长度; = 单词+空格总长度 - 空格长度
* spaceWidth : 当前行空格总长度;
* spaceItemWidth : 往下取整后的单位空格长度
*/
int wordWidth = curLen - (count - 1);
int spaceWidth = maxWidth - wordWidth;
int spaceItemWidth = spaceWidth / (count - 1);
String spaceItem = "";
for (int k = 0; k < spaceItemWidth; k++) {
spaceItem += " ";
}
StringBuilder sb = new StringBuilder();
for (int k = 0, sum = 0; k < count; k++) {
String item = list.get(k);
sb.append(item);
if (k == count - 1)
break;
sb.append(spaceItem);
sum += spaceItemWidth;
// 剩余的间隙数量(可填入空格的次数)
int remain = count - k - 1 - 1;
// 剩余间隙数量 * 最小单位空格长度 + 当前空格长度 < 单词总长度,则在当前间隙多补充一个空格
if (remain * spaceItemWidth + sum < spaceWidth) {
sb.append(" ");
sum++;
}
}
res.add(sb.toString());
}
return res;
}
}
以上是关于Leetcode——文本左右对齐的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 68. 文本左右对齐 / 1894. 找到需要补充粉笔的学生编号 / 600. 不含连续1的非负整数(数位dp,好好学)