题目来源
题目描述
题目解析
模拟题,不难,就是要耐心
class Solution {
public:
vector<string> fullJustify(vector<string>& words, int maxWidth) {
std::vector<string> ans;
int right = 0, n = words.size();
while (true){
int left = right;
// 循环确定当前行可以放多少单词。注意单词之间至少有一个空格 (right - left统计可以存放多少个空格)
int sumLen = 0;
while (right < n && sumLen + words[right].size() + (right - left) <= maxWidth){
sumLen += words[right++].size();
}
// 当前行是最后一行:
if(right == n){
// 单词左对齐,而且单词之间应该只有一个空格
string s = words[left];
for (int i = left + 1; i < n; ++i) {
s += ' ' + words[i];
}
// 在行末尾填充剩余空格
ans.emplace_back(s + std::string(maxWidth - s.length(), ' '));
return ans;
}
// 当前行单词个数
int numWords = right - left;
// 当前行需要补缺的长度
int numSpaces = maxWidth - sumLen;
// 当前行只有一个单词:该单词左对齐,在行末尾填充剩余空格
if(numWords == 1){
ans.emplace_back(words[left] + string(numSpaces, ' '));
continue;
}
//当前行不止一个单词
int avgSpaces = numSpaces / (numWords - 1); // 每个坑位最少需要填补的空格个数
int extraSpaces = numSpaces % (numWords - 1);
string s;
for (int i = left; i < right; ++i) {
if(i == right - 1){
s += words[i];
}else{
if(extraSpaces != 0){
s += words[i] + string(avgSpaces + 1, ' '); // 需要将多余的空格[从左到右放置]
--extraSpaces;
}else{
s += words[i] + string(avgSpaces, ' ');
}
}
}
ans.emplace_back(s);
}
}
};