地址
https://leetcode-cn.com/problems/text-justification/submissions/
描述
思想
代码
class Solution {
public:
vector<string> fullJustify(vector<string>& words, int maxWidth) {
vector<string> res;
for(int i=0;i<words.size();){
string line;
int j=i+1;
//枚举这行一共能放多少个单词
int len=words[i].length();
//注意这里要加上两个单词之间的间隙长度=1
//此时被使用的单词为i~j-1
while (j<words.size()&& len+1+words[j].length()<=maxWidth) {
len+=words[j].length()+1;
j++;
}
//根据j判断此时属于哪种情况
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.push_back(' ');
}
//说明此时要求我们进行左右两端对齐
else{
//计算一下本行一共有多少单词,i~j-1下标的单词被使用,总共有j-i个单词,就有j-i-1个缝隙
int cnt=j-i-1;
//计算剩余的空格有多少,由于上面计算时,加上了缝隙的个数,这里要还回来
int r=maxWidth-len+cnt;
line+=words[i];
//开始填单词,由于要求如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。
//举例还剩10个空格,但是只有3个缝隙,那么第1(10%3)个空格分到(10/3)+1个空格,后面都分到(10/3)个空格
int k=0;
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;
}
return res;
}
};