每天一道LeetCode-----将单词数组分成多行,每行长度相同,单词之间用空格分隔,要求空格尽量均匀分布
Text Justification
原題鏈接Text Justification
將以這個字符串數組重組成幾行,每個字符串用空格分隔,要求
- 每行的長度相同
- 每行的空格需要均勻分配,且每個單詞之間至少有一個空格
- 最后一行盡量將空格放在最后面
首先思路是記錄已遍歷到的單詞的總長度,判斷是否還能容納當前遍歷到的這個單詞。
- 如果能,即之前總長度加上這個單詞長度以及一個分隔空格沒有超過規定長度,繼續遍歷下一個
- 如果不能,那么就將之前遍歷到的所有單詞組成一行,改行需要滿足上面三個約束
可以用兩個下標指針記錄當前遍歷到的單詞,[front, back)表示這個范圍的單詞可以組成一行,而加上back后則不能。
難點在計算每個單詞之間空格的數量,均勻分布空格的意思是
- 假設保證每塊空格長度相同的前提下還剩余n個空格,那么就將前n塊空格的每個空格長度加一
[front, back)表示這個范圍有back - front - 1個單詞,len記錄這個范圍的長度(注,這個長度計算了一個空格在里面,即每個單詞之間至少有一個空格,這個空格長度計算在len中了)
那么每個單詞之間均勻的空格數應該是(maxWidth - len) / (back - front - 1) + 1
+1表示將len中記錄的用于分隔的單詞加上
但是,對于最后一行,因為要保證空格盡量在后面,其實就是保證每個單詞之間只能有一個空格。
所以計算單詞之間空格數量的方法為
如果back == front + 1,說明這一行只有一個單詞,那么分隔為1即可
除了每個單詞均勻的空格數之外,如果剩余n個空格,那么需要將前n個空格塊每一個都增加一個空格。計算這個n的方法其實就是計算剩余多少個空格
int spaces = 1; int extra = 0; if(back != words.size() && back != front + 1) {spaces = (maxWidth - len) / (back - front - 1) + 1;extra = (maxWidth - len) % (back - front - 1); }找到了每個空格塊的數量,就可以組成一行的字符串了。不過要注意前extra個空格快的空格數量是spaces + 1
先處理一行中前extra個空格塊
再處理該行剩下的空格塊
while(front < back) {res.back().append(spaces, ' ');res.back().append(words[front++]); }此時,這一行字符的總數量已經是maxWidth了,但是考慮到最后一行的情況,上述的space是1而extra為0,追加一遍之后總數量不是maxWidth,因為要將空格盡量放在后面,所以這里需要將剩余的空格追加上
res.back().append((maxWidth - res.back().size()), ' ');完整代碼如下
class Solution { public:vector<string> fullJustify(vector<string>& words, int maxWidth) {vector<string> res;int back = 0;while(back < words.size()){int front = back;int len = words[back++].size();while(back < words.size() && len + 1 + words[back].size() <= maxWidth){len += 1 + words[back].size();++back;}int spaces = 1;int extra = 0;if(back != words.size() && back != front + 1){spaces = (maxWidth - len) / (back - front - 1) + 1;extra = (maxWidth - len) % (back - front - 1);}res.emplace_back(words[front++]);while(extra--){res.back().append(spaces+1, ' ');res.back().append(words[front++]);}while(front < back){res.back().append(spaces, ' ');res.back().append(words[front++]);}res.back().append((maxWidth - res.back().size()), ' ');}return res;} };本題主要難點在確定空格數,邏輯上用while比for循環清晰不少
總結
以上是生活随笔為你收集整理的每天一道LeetCode-----将单词数组分成多行,每行长度相同,单词之间用空格分隔,要求空格尽量均匀分布的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天一道LeetCode-----将用数
- 下一篇: 每天一道LeetCode-----重新实