描述如下,要求从一个字符串数组,选择若干个单词组成一个新字符串,并相互之间对齐,注意以下几点:
1 单词直接至少相差一个空格;
2 每一行都要求左对齐;除了最后一行,其他行都要求右对齐,最后一个行,只要保证左对齐即可;
3 每一行元素总数一定一样,若缺少用空格补,原则是要求左右空格数目均匀,若做不到均匀则左侧较多空格。
例如:
words: ["This", "is", "an", "example", "of", "text", "justification."]
L: 16
.
结果:
[
"This is an",
"example of text",
"justification. "
]
vector<string> fullJustify(vector<string>& words, int maxWidth) {
vector<string> res;
int index=0;
int cursize=0;//所在行当前长度
int bgn=0;//上一行开始位置
while(index<words.size()){
int newsize=cursize+words[index].size()+index-bgn;
if(newsize<=maxWidth){cursize+=words[index].size();index++;}
else{
string tmp="";
int spacecnt=(index-bgn>1)?index-bgn-1:1;//正常的单词之间空格一个,这里求得是总的个数
int spacelen=(maxWidth-cursize)/spacecnt;//每个单词之间实际空格长度
for(int i=0;i<index-bgn;i++){
tmp+=words[i+bgn];
if(index-bgn!=1&&i==index-bgn-1)break;//该行不是一个单词组成时,最后一个单词不加空格,以保证右靠齐
if(i<maxWidth-cursize-spacecnt*(spacelen))
tmp+=string(spacelen+1,' ');//不均时左多
else
tmp+=string(spacelen,' ');
}
res.push_back(tmp);
cursize=0;bgn=index;
}
}
//处理最后一行
string tmp="";
for(int i=bgn;i<index;i++){
tmp+=words[i];
if(i==index-1)break;//最后一个单词不加空格
else tmp+=" ";
}
tmp+=string(maxWidth-cursize-(index-bgn-1),' ');
res.push_back(tmp);
return res;
}
参考:
文献