题解:
class Solution {
public:
//每一行单词平均分配空格
//bg:单词数组中该行开始单词的下标(即该行第一个单词在数组中的下标)
// ed:单词数组中该行结束单词的下标(即该行最后一个单词在数组中的下标)
string fillWords(vector<string>& words,int bg,int ed,int maxWidth,bool lastLine = false){
//单词数
int wordCount = ed-bg+1;
//空格数 初始 减去正常情况下每个单词后面的空格
int spaceCount = maxWidth+1-wordCount;
for(int i = bg;i<=ed;i++){
//减掉每个单词的长度 得到额外空格数
spaceCount-=words[i].size();
}
//词尾空格
int spaceSuffix = 1;
//额外空格的平均数
int spaceAvg = (wordCount == 1)?1:spaceCount/(wordCount-1);
//额外空格的余数
int spaceExtra = (wordCount == 1)?0:spaceCount%(wordCount-1);
//该行单词填充结果
string ans;
for(int i = bg;i<ed;i++){
//填入单词
ans+=words[i];
//特殊处理最后一行
if(lastLine){
//最后一行 每个单词之间都是一个空格
fill_n(back_inserter(ans),1,' ');
continue;
}
//向该单词后插入空格 词尾空格+平均额外空格数+(前spaceExtra个单词需要多一个空格)
fill_n(back_inserter(ans),spaceSuffix+spaceAvg+((i-bg)<spaceExtra),' ');
}
//填入最后一个单词
ans+=words[ed];
//填入最后的空格
fill_n(back_inserter(ans),maxWidth-ans.size(),' ');
return ans;
}
vector<string> fullJustify(vector<string>& words, int maxWidth) {
vector<string> result;
int cnt = 0;
int bg = 0;
for(int i = 0;i<words.size();i++){
//每一行当前长度
cnt+=words[i].size()+1;
//最后一个单词 或者当前长度加上下一个单词的长度 即可凑成一行
if(i+1 == words.size() || cnt+words[i+1].size()>maxWidth){
result.push_back(fillWords(words,bg,i,maxWidth,i+1 == words.size()));
bg = i+1;
//下一行计数归零
cnt = 0;
}
}
return result;
}
};