原题链接
要求:
①每行尽可能放多的单词。
②在单词之间填补空格,使得每行的长度是 maxWidth。
③单词之间的空格需要尽量均匀,如果空格数不能被(单词数量-1)整除,可让左边比右边多1。
④对于最后一行,只需实现左对齐,并且不用在单词之间添加额外空格。
⑤对于除最后一行的其他行,如果只有一个单词,则左对齐与④一样。
⑥除此之外,则左右对齐。
对于空格的分配:
对于每一行,首先做到对空格平均分配。空格可以安插在两两单词间隙之间,设单词间隙的个数为 cnt,空格个数为 r,如果有多出来的空格该如何分配呢?根据题干:如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。 所以我们把平均分配后剩下的空格数(r % cnt)从左到右依次加一。
其他的步骤就是模拟就行了!
c++:
class Solution {
public:
vector<string> fullJustify(vector<string>& words, int maxWidth) {
vector<string> res;
for(int i = 0;i < words.size();i++)
{
int j = i + 1;//取每个单词的后一个单词
int len = words[i].size();
while(j < words.size() && len + 1 + words[j].size() <= maxWidth)//判断后一个单词是否满足要求,已有的长度+空格数+j的长度是否在maxWidth之内
{
len += 1 + words[j++].size();//更新长度
}
//i是该行满足要求的第一个单词,j是最后一个
string line;//存储每一行
if(j == words.size() || j == i + 1)//最后一行,或者除最后一行只有一个单词
{
line += words[i];
for(int k = i + 1;k < j;k++) line += " " + words[k];//将所有单词加完
while(line.size() < maxWidth) line += " ";//补充剩下的空格
}
else
{
int cnt = j - i - 1,r = maxWidth - len + cnt;//cnt间隙数量,r空格数(maxWidth - len多减了间隙数,所以要加上cnt)
line += words[i];
int k = 0;
//对平均分配后剩下的数量,从左至右依次多加1
while(k < r % cnt) line += string(r / cnt + 1,' ') + words[i + k + 1],k++;
//其余的平均分配
while(k < cnt) line += string(r / cnt,' ') + words[i + k + 1],k++;
}
res.push_back(line);
i = j - 1;//更新每行起点
}
return res;
}
};