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