基本思路:
leetCode68. 文本左右对齐
代码
cpp
class Solution {
public:
vector<string> fullJustify(vector<string>& words, int maxWidth) {
vector<string> res;
for(int i = 0; i < words.size(); i++){ // 枚举有多少个单词
int j = i + 1; // j表示各单词的下标
int len = words[i].size(); // 该单词的长度
// 看当前行可以放多少个单词
// 当前单词长度 + 1个空格 + 下一个单词的长度 <= maxwidth,表示改行还可以继续放
while(j < words.size() && len + 1 + words[j].size() <= maxWidth){
len += 1 + words[j++].size();
}
string line = "";
if(j == words.size() || j == i + 1){
// 当j是在最后的位置,或者当前行只有一个单词,进行左对齐
line += words[i];
for(int k = i + 1; k < j; k++){
line += ' ' + words[k];
}
while(line.size() < maxWidth) line += ' ';
}else{ // 进行的是左右对齐
int cnt = j - i - 1; //空隙的数量 = 单词的数量(j - i)- 1
int r = maxWidth - len + cnt; // 总共的空格数量
line += words[i];
int k = 0;// 表示从第一个空隙开始计算
while(k < r % cnt) { // 除不尽,r%cnt !=0,则前r%cnt个间隙r/cnt+1个空格,最后一个间隙r/cnt个空格
line += string(r / cnt + 1, ' ') + words[i + k + 1];
k++;
}
while(k < cnt) {// 这里加while是因为如果能整除,r%cnt=0,则全部为r/cnt个空格,对于每个cnt间隙内
line += string(r / cnt, ' ') + words[i + k + 1];
k++;
}
}
res.push_back(line);
i = j - 1;
}
return res;
}
};