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;
}
};
程序結果如下: