题目链接
文本左右对齐
题目描述
注意点
- words[i] 由小写英文字母和符号组成
- 每个单词的长度大于 0,小于等于 maxWidth
- 输入单词数组 words 至少包含一个单词
- 要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数
解答思路
- 模拟本题思路,除最后一行外,其余行每个单词中间要放入数量均匀分配的空格数量,且最后一个单词末尾无空格(只有一个单词的特殊情况除外),而最后一行的每个单词中间的空格数只有一个,最后一个单词添加空格至该行长度到maxWidth
- 第一点是要找到每行应该有哪些单词,在判断加入单词长度是否超过maxWidth时,还要默认两个单词中间有一个空格(也就是该行的最少空格数量),以此为基础判断每行应该存放的单词
- 第二点是要找到任意一行中每两个单词之间的空格数量,除最后一行外,单词间的空格数均匀分配,且如果无法完全均匀分配时左边单词间的空格数要多于右边单词间的空格数,例如5个单词间需要有10个空格,则应该是3、3、2、2的空格分配
- 第三点是对最后一行中空格的特殊处理,其应该为单词间的空格数都为1,然后将剩余的空格都填充到该行末尾
- 第四点是某一行只有一个单词的特殊处理,如果其最后一行的单词则规则不变,如果不是最后一行则要特殊判断特殊处理,也就是将剩余空格都添加到该单词末尾
代码
class Solution {public List<String> fullJustify(String[] words, int maxWidth) {List<String> res = new ArrayList<>();int idx = 0;while (idx < words.length) {// 该行写入的单词List<String> rowWords = new ArrayList<>();// 该行单词总长度int rowWordLen = 0;for (int i = idx; i < words.length; i++) {// 能否容纳下一个新单词// rowWords.size()为假设加入该单词需要的最小空格数// words[idx].length() + rowWordLen为假设加入该单词后的单词总长度if (rowWords.size() + words[idx].length() + rowWordLen > maxWidth) {break;}rowWords.add(words[idx]);rowWordLen += words[idx].length();idx++;}StringBuilder sb = new StringBuilder();// 已填充至最后一个单词->最后一行if (idx - 1 >= words.length - 1) {for (String word : rowWords) {sb.append(word + " ");}sb.deleteCharAt(sb.length() - 1);addSpace(sb, maxWidth - sb.length());} else {// 只有一个单词if (rowWords.size() == 1) {sb.append(rowWords.get(0));addSpace(sb, maxWidth - sb.length());} else {int basicSpace = (maxWidth - rowWordLen) / (rowWords.size() - 1);int residueSpace = (maxWidth - rowWordLen) % (rowWords.size() - 1);for (int i = 0; i < rowWords.size() - 1; i++) {sb.append(rowWords.get(i));int spaceCount = basicSpace;if (residueSpace > 0) {spaceCount++;residueSpace--;}addSpace(sb, spaceCount);}sb.append(rowWords.get(rowWords.size() - 1));}}res.add(sb.toString());}return res;}public void addSpace(StringBuilder sb, int spaceCount) {for (int i = 0; i < spaceCount; i++) {sb.append(" ");}}
}
关键点
- 怎么找到某一行中的所有单词
- 怎么判断某一行是否是最后一行
- 模拟对非最后一行中的单词填充空格
- 对某行只有一个单词的特殊处理