这是一个文本对其的功能,给定一个单词数组,及指定的宽度,具体要求如下:
- 每一行包含整数个单词,每行两边对齐,其中空格要尽量在单词间分布均匀;
- 只包含一个单词的左对齐;
- 最后一行无需对齐,左对齐即可
解决思路:
1 先遍历单词组,记录每行可以容纳的单词个数,及这些单词正常连接的长度;
2 根据记录的单词个数,及正常长度,计算每行每个单词间应该添加的空格数目
以下是AC的代码:
class Solution {
public:
vector<string> fullJustify(vector<string>& words, int maxWidth) {
vector<tuple<int,int>> count;
vector<string> res;
int cnt = 1;
int len = words[0].size();
/*
* 计算每行应该包含的单词个数,及这些单词组合后的长度(单词间的一个空格需要考虑进去)
* 用元组的格式记录
*/
for (int index=1;index<words.size();++index){
if (len + words[index].size()+cnt > maxWidth){
//cnt表示个数,cnt-1表示空格数
count.push_back(make_tuple(len+cnt-1,cnt));
len = words[index].size();
cnt = 1;
}else{
len+=words[index].size();
cnt++;
}
}
count.push_back(make_tuple(len+cnt-1,cnt));
int index = 0;
for (int pos=0;pos<count.size();pos++){
int len = std::get<0>(count[pos]);
int cnt = std::get<1>(count[pos]);
//std::cout<<"Tuple: "<<len<<","<<cnt<<std::endl;
if (cnt == 1){
string tmp = words[index];
tmp.append(maxWidth-len,' ');
res.push_back(tmp);
index++;
continue;
}
//even表示每个单词间空格的基数
//left:从左至右每个间隔依次加一个,直至加完
int even = (maxWidth-len)/(cnt-1);
int left = (maxWidth-len)%(cnt-1);
string line="";
//处理最后一行
if (pos == count.size()-1){
for (int ofs=0;ofs<cnt;ofs++){
line = line + words[index+ofs];
if (ofs < cnt-1)
line.append(1,' ');
}
line.append(maxWidth-len,' ');
}else{
for (int ofs=0;ofs<cnt;ofs++){
line = line + words[index+ofs];
if (ofs < cnt-1)
line.append(1+even,' ');
if (left > 0){
line.append(1,' ');
left--;
}
}
}
res.push_back(line);
index = index+cnt;
}
return res;
}
};
网友评论