算法:文本左右对齐
題目
給定一個單詞數組和一個長度 maxWidth,重新排版單詞,使其成為每行恰好有 maxWidth 個字符,且左右兩端對齊的文本。
你應該使用“貪心算法”來放置給定的單詞;也就是說,盡可能多地往每行中放置單詞。必要時可用空格 ’ ’ 填充,使得每行恰好有 maxWidth 個字符。
要求盡可能均勻分配單詞間的空格數量。如果某一行單詞間的空格不能均勻分配,則左側放置的空格數要多于右側的空格數。
文本的最后一行應為左對齊,且單詞之間不插入額外的空格。
說明:
- 單詞是指由非空格字符組成的字符序列。
- 每個單詞的長度大于 0,小于等于 maxWidth。
- 輸入單詞數組 words 至少包含一個單詞。
示例:
輸入: words = ["This", "is", "an", "example", "of", "text", "justification."] maxWidth = 16 輸出: ["This is an","example of text","justification. " ] //文本左右對齊1.盡可能多的在每行放置更多的單詞,必要時用' '填充 2.要求更可能均勻的分配單詞間空格的數量,如果某一行不能均勻分配,那左側放置的空格數要多于右側 3.文本最后一行要左對齊,且單詞之間不能插入額外的空格string fillWords(vector<string>& words, int bg, int ed, int maxWidth, bool lastLine = false){//單詞數量int wordCount = ed - bg + 1;int spaceCount = maxWidth + 1 - wordCount; // 除去每個單詞尾部空格, + 1 是最后一個單詞的尾部空格的特殊處理for (int i = bg; i <= ed; i++){spaceCount -= words[i].size(); // 除去所有單詞的長度}//spaceCount是剩下的總空格數int spaceSuffix = 1; // 詞尾空格int spaceAvg = (wordCount == 1) ? 1 : spaceCount / (wordCount - 1); // 額外空格的平均值int spaceExtra = (wordCount == 1) ? 0 : spaceCount % (wordCount - 1); // 額外空格的余數string ans;for (int i = bg; i < ed; i++){ans += words[i]; // 填入單詞if (lastLine) // 特殊處理最后一行{fill_n(back_inserter(ans), 1, ' ');continue;}fill_n(back_inserter(ans), spaceSuffix + spaceAvg + ((i - bg) < spaceExtra), ' '); // 根據計算結果補上空格}ans += words[ed]; // 填入最后一個單詞fill_n(back_inserter(ans), maxWidth - ans.size(), ' '); // 補上這一行最后的空格return ans; }//每行有maxWidth字符,包括空格 vector<string> fullJustify(vector<string>& words, int maxWidth) {vector<string> ans;int cnt = 0;int bg = 0;for (int i = 0; i < words.size(); i++){cnt += words[i].size() + 1;if (i + 1 == words.size() || cnt + words[i + 1].size() > maxWidth){ // 如果是最后一個單詞,或者加上下一個詞就超過長度了,即可湊成一行ans.push_back(fillWords(words, bg, i, maxWidth, i + 1 == words.size()));bg = i + 1;cnt = 0;}}return ans; }鏈接:https://leetcode-cn.com/problems/text-justification/solution/text-justification-by-ikaruga/
總結
- 上一篇: 算法:插入区间
- 下一篇: 算法:柱状图中最大矩形