68. 文本左右对齐(简单模拟)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了68. 文本左右对齐(简单模拟)相关的知识,希望对你有一定的参考价值。
68. 文本左右对齐 (简单模拟)
先计算出当前行最多放多少个单词。
然后根据单词数算出间隔数和总空格数。
如果是最后一行,则每个间隔放一个空格。
否则放 s p a c e s g a p \\dfrac{spaces}{gap} gapspaces个,若 i − L < ( s p a c e ( m o d g a p ) ) i-L< (space\\pmod {gap}) i−L<(space(modgap)) 则 + 1 +1 +1。
然后将最后一个单词的后面都补充空格。
参考代码
class Solution {
public:
vector<string> fullJustify(vector<string>& words, int maxWidth) {
vector<string> res;
int n = words.size();
for(int L = 0, R = 0; L < n; L = R ) {
int w = words[ L ].length(); //记录当前行长度
for(R++; R < n && w + 1 + words[ R ].length() <= maxWidth; R++) w += 1 + words[ R ].length(); //将单词长度加上1个空格计算进当前行长度
int gap = R - L - 1; //单词之间的间隔数
int spaces = maxWidth - w + gap; //该行的空格总数
res.push_back("");
for(int i = L; i < R - 1; i++ ) { //处理最后一个单词前的单词,如果当前行只有一个单词就不会进入这里
res.back() += words[ i ];
res.back().append(R < n ? spaces / gap + ( (i - L) < (spaces % gap) ? 1 : 0) : 1, ' ');
//如果R<n,代表当前不是最后一行,计算需要加几个空格
//如果R==n,代表当前是最后一行,每个单词后面只加1个空格
}
res.back() += words[ R - 1 ]; //放入最后一个单词
res.back().append(maxWidth - res.back().length(), ' ');
//如果当前是最后一行,或者当前行只有一个单词,才会出现长度不够maxWidth,用空格补足
}
return res;
}
};
以上是关于68. 文本左右对齐(简单模拟)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 68 文本左右对齐[贪心] HERODING的LeetCode之路
LeetCode 68. 文本左右对齐 / 1894. 找到需要补充粉笔的学生编号 / 600. 不含连续1的非负整数(数位dp,好好学)