68. 文本左右对齐

自己做

解:直接遍历划分情况
cpp
class Solution {
public:
vector<string> fullJustify(vector<string>& words, int maxWidth) {
vector<string> res;
string row; //当前行
int row_len = 0; //当前行的单词长度
int begin = 0; //begin,end标记一行起始
int end = 0;
while(end < (int)words.size()){
row_len += words[end].size() + 1;
if(row_len - 1 > maxWidth){ //超过一行限制,该行包含的单词:[begin,end) => 从words[begin]取到words[end - 1],注:这里必然不可能是尾行
row_len -= (words[end].size() + 2); //去除越界的部分:最后一个单词和两边的空格
// cout << row_len << endl;
int space_sum = maxWidth - row_len; //要补充的空格总数
int div_space = 0;
int add_space = 0;
if(end - begin - 1 != 0){
div_space = space_sum / (end - begin - 1); //每个间隔的补充长度
add_space = space_sum % (end - begin - 1); //额外补充间隔的长度
}
// cout << begin << "," << end << "," << div_space << "," << add_space << endl;
//一行
for(int i = begin; i < end; i++){
row += words[i]; //拼接单词
//加空格
if(i != end - 1){
row += string(div_space + 1, ' '); //每个间隔长度
if(add_space > 0){ //如果有额外要补充的间隔,从左往右进行补充
row += ' ';
add_space--;
}
}
}
//一行只有一个单词的情况,往后补充空格
if(begin == end - 1)
//尾部加空格
row += string(maxWidth - row_len, ' ');
//一行结束,调整begin起始位置,将该行加入结果
res.push_back(row);
begin = end;
row = "";
row_len = 0;
}
else if(row_len - 1 == maxWidth){ //刚好够一行,该行包含的单词:[begin,end] => 从words[begin]取到words[end]
//一行
for(int i = begin; i <= end; i++){
row += words[i]; //拼接单词
//加空格
if(i != end)
row += " "; //每个间隔长度为1
}
//一行结束,调整begin起始位置,将该行加入结果
res.push_back(row);
end++;
begin = end;
row = "";
row_len = 0;
}
else{ //对于没填充满的情况: row_len - 1 < 16
if(end == (int)words.size() - 1){ //如果是尾行,后面补充空格
//一行
for(int i = begin; i <= end; i++){
row += words[i]; //拼接单词
//加空格
row += " "; //每个间隔长度为1
}
//尾部加空格
row += string(maxWidth - row_len, ' ');
//加入结果并结束循环
res.push_back(row);
break;
}
else //如果不是尾行,继续往后延伸
end++;
}
}
return res;
}
};
