做完此题意味着刷完第一遍leetcode!!!撒花!!!
这一题需要注意两个点[1]:
a、当该行只放一个单词时,空格全部在右边;
b、最后一行中单词间只有一个空格,其余空格全部在右边。然后只要贪心选择,在一行中尽量放多的单词。
还有注意均匀分摊空格(先除整,然后再分摊余数)。
class Solution {
private:
void addSpace(string &str, int count) {
for(int i=1;i<=count;i++)
str.push_back(' ');
}
public:
vector<string> fullJustify(vector<string> &words, int L) {
vector<string> ret;
int len=words.size(),begin=0;
while(begin<len)
{
int lineLen=0,end=begin;
while(end<len && lineLen+words[end].size()<=L)
{
lineLen+=(words[end].size()+1);
end++;
}
if(end-begin==1)
{
ret.push_back(words[begin]);
addSpace(ret.back(),L-words[begin].size());
begin=end;
continue;
}
int charsLen=lineLen-(end-begin);
int meanSpace=end<len ? (L-charsLen)/(end-begin-1) : 1;
int leftSpace=end<len ? (L-charsLen)%(end-begin-1) : L-charsLen-(end-begin-1);
string tmp;
for(int i=begin;i<end-1;i++)
{
tmp+=words[i];
addSpace(tmp,meanSpace);
if(end<len && leftSpace>0) //均匀分摊空格
{
tmp.push_back(' ');
leftSpace--;
}
}
tmp+=words[end-1];
if(end>=len)
addSpace(tmp,leftSpace);
ret.push_back(tmp);
begin=end;
}
return ret;
}
};
参考:
[1] http://www.cnblogs.com/TenosDoIt/p/3475275.html