分类:algorithm| 发布时间:2017-04-05 11:12:00
给定一个单词数组和一个长度 maxWidth,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。
你应该使用“贪心算法”来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ' ' 填充,使得每行恰好有 maxWidth 个字符。
要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。
文本的最后一行应为左对齐,且单词之间不插入额外的空格。
说明:
示例:
输入:
words = ["This", "is", "an", "example", "of", "text", "justification."]
maxWidth = 16
输出:
[
"This is an",
"example of text",
"justification. "
]
示例 2:
输入:
words = ["What","must","be","acknowledgment","shall","be"]
maxWidth = 16
输出:
[
"What must be",
"acknowledgment ",
"shall be "
]
解释: 注意最后一行的格式应为 "shall be " 而不是 "shall be",
因为最后一行应为左对齐,而不是左右两端对齐。
第二行同样为左对齐,这是因为这行只包含一个单词。
示例 3:
输入:
words = ["Science","is","what","we","understand","well","enough","to","explain",
"to","a","computer.","Art","is","everything","else","we","do"]
maxWidth = 20
输出:
[
"Science is what we",
"understand well",
"enough to explain to",
"a computer. Art is",
"everything else we",
"do "
]
class Solution {
public:
vector<string> fullJustify(vector<string>& words, int maxWidth) {
vector<string> ret;
int currentLen = 0, begin = 0, i = 0;
for (; i < words.size(); ++i) {
if (currentLen + words[i].size() + (i - begin) > maxWidth) {
packToLine(words, begin, i, currentLen, maxWidth, ret);
begin = i;
currentLen = words[i].size();
} else {
currentLen += words[i].size();
}
}
lastPack(words, begin, words.size(), currentLen, maxWidth, ret);
return ret;
}
void packToLine(vector<string> &words, int begin, int end, int currentLen, int maxWidth, vector<string> &ret) {
const int space = maxWidth - currentLen;
if (end == begin + 1) {
string s = words[begin];
s.append(space, ' ');
ret.push_back(s);
return;
}
int pad = space / (end - begin - 1);
int extra = space % (end - begin - 1);
string s;
for (int i = begin; i < end - 1; ++i) {
s += words[i];
s.append(pad, ' ');
if (extra) {
s.push_back(' ');
--extra;
}
}
s += words[end - 1];
ret.push_back(s);
}
void lastPack(vector<string> &words, int begin, int end, int currentLen, int maxWidth, vector<string> &ret) {
int space = maxWidth - currentLen;
string s;
for (int i = begin; i < end; ++i) {
s += words[i];
if (space) {
s.push_back(' ');
--space;
}
}
if (space)
s.append(space, ' ');
ret.push_back(s);
}
};