思路:贪心算法,一行一行的处理。
1.首先要确定每一行能放下的单词数。具体方法是 将单词数n和空格数n-1与每 一行的最大字符数maxWidth来比较。
2.确定了单词数后,还要判断是否为最后一行,最后一行每个单词间加一个空格。如果不是最后一行,要判断空格数和单词的间隔数n-1是否整除,整除的话空格数等分,不整除的话前面单词的空格数多。即代码中的
if(space%(j-k-1)= =0) t=space/(j-k-1);
else t=space/(j-k-1)+1;
注意:代码中的j并不是每一行最后一个单词的下标,而是最后一个单词的下一个的下标,所以代码中会出现 if (j==words.size())来判断是否为最后一行。
class Solution {
public:
vector<string> fullJustify(vector<string>& words, int maxWidth) {
vector<string> ans;
int i=0;
while(i<words.size())
{
int j=i,len=0;
while(j<words.size() && len+words[j].size()+j-i<=maxWidth )
len+=words[j++].size();
string tmp;
int space=maxWidth-len;
for(int k=i;k<j;++k)
{
tmp+=words[k];
if(space>0)
{
int t;
if(j==words.size())
{
if(j-k==1) t=space;
else t=1;
}
else
{
if(j-k-1>0)
{
if(space%(j-k-1)==0) t=space/(j-k-1);
else t=space/(j-k-1)+1;
}
else t=space;
}
tmp.append(t,' ');
space-=t;
}
}
i=j;
ans.push_back(tmp);
}
return ans;
}
};