> 文章列表 > 力扣:文本左右对齐

力扣:文本左右对齐

力扣:文本左右对齐

原题链接
要求:
①每行尽可能放多的单词
②在单词之间填补空格,使得每行的长度是 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;//对平均分配后剩下的数量,从左至右依次多加1while(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;}
};