Text Justification
这个题的意思比较简单,但是情况很复杂,输入一些列单词,然后将这些单词按照规定的长度组合,参照例子大概就可以知道组合的规律,首先分析一下,然后再给出解题思路。这个题的规律如下:
(1).每两个单词之间有一个空格,一行中若有些单词无法完全排列下来就将它放在新的一行中。
(2).最后一行和他之前的所有行有些不一样,最后一行是按照一个单词一个空格来排列的;而他之前的每行,若有两个单词,则这两个单词必须分别在最左和最右端。
我提供两个测试用例来帮助大家分析容易漏掉的地方:
除了上面两种情况以外,还有的情况就是:
[""] 2 [" "] (L的长度为2,但是提供的只是一个空串,但是返回的结果却要包含两个长度,即: [" "])
解题思路:遍历单词数组,统计每个单词的长度(算上空格的占位),若是当前位置所在的区间的所有单词的长度大于题目给定的长度,那么就需要按照规律插入,就这样一直执行,最后需要判断最后一行的处理。
我的解题代码如下:
class Solution
{
public:
vector<string> fullJustify(vector<string>& words, int maxWidth)
{
vector<string> ret;
ret.clear();
if (words.size() == 0 || maxWidth <= 0)
{
return words;
}
int begin = 0; //开始位置
int end = words.size(); //结束为止
int num = 0; //统计每个区间单词的个数(这个区间就是需要合并的单词的区间)
int sz = 0; //统计纯单词的长度
int bits = 0; //统计包括每个单词后面跟上空格后的数量
int offset = 0; //偏移量
while (begin < end)
{
int len = words[begin].size();
if (len > maxWidth)
{
return vector<string>(1,"");
}
if (bits + len >maxWidth)
{ //占位超过,需要添加
string tmp = "";
if (num == 1)
{//单独一个的时候需要补齐
int len = words[offset + num - 1].size();
tmp = words[offset + num - 1];
tmp += string(maxWidth - len, ' ');
}
else
{
int every = (maxWidth - sz) / (num - 1);
int left = maxWidth - sz - (num - 1)*every;
int pos = 0;
for (int i = 0; i < num-1; ++i)
{
tmp += words[offset + i];
if (pos < left)
{
string tb(every + 1, ' ');
tmp += tb;
}
else
{
string tb(every, ' ');
tmp += tb;
}
++pos;
}
if (num > 0)
{ //num不为0
tmp += words[offset + num - 1];
}
else
{ num为0的特殊情况
int len = words[offset + num].size();
tmp += words[offset + num];
tmp += string(maxWidth - len, ' ');
}
}
ret.push_back(tmp);
if (num > 0)
offset += num;
else
offset += 1; //num为0的特殊情况
//统计完一行后需要将以下变量置0
num = 0;
sz = 0;
bits = 0;
}
sz += len; //不算空格
bits += len + 1; //算上空格
++num;
++begin;
}
//最后一行没有处理,最后一行的格式有别于之前的
if (offset != end)
{
string tmp = "";
if (num == 1)
{
int len = words[offset + num - 1].size();
tmp = words[offset + num - 1];
tmp += string(maxWidth - len, ' ');
}
else
{
int pos = 0;
for (int i = 0; i < num - 1; ++i)
{
tmp += words[offset + i];
tmp += ' ';
++pos;
}
tmp += words[offset + num - 1];
tmp += string(maxWidth - bits + 1, ' '); //空格补齐
}
ret.push_back(tmp);
}
return ret;
}
};
程序结果如下: