68. 文本左右对齐

自己做

解:直接遍历划分情况
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 < 16if(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;}
};
