
思路分析
1. 辅助函数
-
blank(n)
:
- 生成由
n
个空格组成的字符串。 - 示例:
blank(3)
→ " "
。
-
join(words, left, right, sep)
:
- 将
words[left..right-1]
用分隔符 sep
拼接成字符串。 - 示例:
join(["a","b","c"], 0, 3, "-")
→ "a-b-c"
。
2. 主函数 fullJustify
外层循环
while (true) {int left = right; int sum = 0; while (right < n && sum + words[right].size() + (right - left) <= maxWidth) {sum += words[right++].size();}
}
- 作用:确定每行可以放置哪些单词。
- 关键条件:
sum + words[right].size() + (right - left) <= maxWidth
表示当前单词长度 + 已有单词长度 + 最小空格数(每个间隔至少 1 空格)不超过 maxWidth
。
处理最后一行
if (right == n) {string s = join(words, left, n, " "); ans.emplace_back(s + blank(maxWidth - s.size())); return ans;
}
- 规则:最后一行左对齐,单词间单空格,行末补足空格。
处理单单词行
if (numWords == 1) {ans.emplace_back(words[left] + blank(numSpace));continue;
}
处理多单词行
int avgSpace = numSpace / (numWords - 1);
int extraSpace = numSpace % (numWords - 1);
string s1 = join(words, left, left + extraSpace + 1, blank(avgSpace + 1));
string s2 = join(words, left + extraSpace + 1, right, blank(avgSpace));
ans.emplace_back(s1 + blank(avgSpace) + s2);
- 步骤:
- 计算空格分配:
avgSpace
:每个间隔的基础空格数。extraSpace
:前几个间隔需多分 1 个空格。
- 分割单词:
s1
:前 extraSpace + 1
个单词,用 avgSpace + 1
空格连接。s2
:剩余单词,用 avgSpace
空格连接。
- 拼接结果:
s1
和 s2
之间用 avgSpace
空格连接。
class Solution {
public:string blank(int n){return string(n,' ');}string join(vector<string>&words,int left,int right,string sep){string s=words[left];for(int i=left+1;i<right;i++){s+=sep+words[i];}return s;}vector<string> fullJustify(vector<string>& words, int maxWidth) {vector<string> ans;int right=0,n=words.size();while(1){int left=right;int sum=0;while(right<n&&sum+words[right].size()+right-left<=maxWidth){sum+=words[right++].size();}if(right==n){string s=join(words,left,n," ");ans.emplace_back(s+blank(maxWidth-s.size()));return ans;}int numWords=right-left;int numSpace=maxWidth-sum;if(numWords==1){ans.emplace_back(words[left]+blank(numSpace));continue;}int avgSpace=numSpace/(numWords-1);int extraSpace=numSpace%(numWords-1);string s1=join(words,left,left+extraSpace+1,blank(avgSpace+1));string s2=join(words,left+extraSpace+1,right,blank(avgSpace));ans.emplace_back(s1+blank(avgSpace)+s2);}}
};