思路:
首先记录一下当前行可以放多少个单词,并记录下单词以及两个单词之间空格的长度,对统计好的长度进行分析,有两种情况,第一种是左对齐,即当前行只有一个单词或者已经到了最后几个单词,虽然可以再放,但是单词的个数已经不够了。第二种情况是两边左右对齐。
代码:
class Solution {
public:
vector<string> fullJustify(vector<string>& words, int maxWidth) {
vector<string> res;
int n=words.size();
for(int i=0;i<n;i++){
//首先看一下每一行可以放多少个单词。
int j=i+1;
int len=words[i].size();
//还要算上两个单词之间的空格
while(j<n && words[j].size() + 1 + len <= maxWidth)
len+=(words[j++].size() + 1);
//判断两种情况
//左对齐 单词数量不够 只有一个单词
string line;
if(j == n || i + 1 == j){
line+=words[i];
int k=i+1;
while(k<j) line+=' ' + words[k++];
while(line.size() < maxWidth) line+=' ';
}
//左右对齐
else{
//因为空格的数量不一定是均匀分布在每个空隙 所以如果出现多余的空格需要放在前面
//t 空隙个数 r空格个数 把 r%t 即多余的空格放在前面 剩下的均匀分布
int cnt=j-i-1, r=maxWidth-len+cnt;
line += words[i];
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);
//for循环中 还有一次 i++
i=j-1;
}
return res;
}
};
评论区