這個題的接受率好低,搞得我一直不敢做。後來認真的看了一下題目,不是很難嘛,字串的題目ac率就是低,除了難,還因為它的測試案例太多。
思路不難,主要是因為特殊情況太多。純類比,我把所有的情況羅列一下,仔細一點的話就能寫好了。
1. 當word為空白,也就是""時,應該返回一行跟L數目相等的空格。這種情況需要提前判斷和處理。
2. 噹噹前行不是最後一行時,應該儘可能多的放單詞,單詞不能截斷,在這一行上,單詞應該分布的儘可能均勻,且要把這一行填滿,效果就跟word排版裡面的撐滿整行很像。怎樣實現這個功能呢?我的做法是先確定這一行中能放多少個單詞,注意計算的時候,要在單詞之間插入一個空格。然後看看這一行中一共需要插入多少個空格(L-單詞的總長度),用 總的空格數/(單詞數-1),就知道每個單詞之間至少插入多少個空格,如果還有剩餘(總空格數%(單詞數-1)),就從左往右,每次填上一個,用完為止。
還有一種情況,如果這一行中只能放一個單詞,要把這個單詞放在最左邊,然後添加空格到L長度。
3. 如果當前行是最後一行,那麼要將單詞儘可能的往左邊排列,單詞之間插入一個空格。右側用空格填充到L。
怎樣知道當前行是不是最後一行呢,我的方法是每次確定單詞範圍時,看看這個範圍的尾部是不是word的結尾。
class Solution {public: vector<string> fullJustify(vector<string> &words, int L) { int msize = words.size(); int i=0, j, part, tpl; vector<string> res; if(words[0] == ""){ string s(L, ' '); res.push_back(s); return res; } string tpline, spspace; while(i<msize){ part = 1; tpl = words[i].length(); j = i+1; while(j<msize&&tpl+words[j].length()+part<=L){ tpl += words[j].length(); ++part; ++j; } --part; tpline = words[i]; if(j != msize&&part!=0){ int spaces = L-tpl; int extraspace = spaces%part; int spa=spaces/part; string sspace(spa, ' '); for(int k=i+1;k<j;k++){ spspace = sspace; if(extraspace>0){ spspace += " "; --extraspace; } tpline += spspace + words[k]; } res.push_back(tpline); }else{ for(int k=i+1;k<j;k++){ tpline += " " + words[k]; } int l=tpline.length(); for(int k=0;k<L-l;k++) tpline += " "; res.push_back(tpline); } //cout<<tpline<<endl; i = j; } return res; }};