给定一个单词数组和一个长度 maxWidth,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。
你应该使用“贪心算法”来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ' '
填充,使得每行恰好有 maxWidth 个字符。
要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。
文本的最后一行应为左对齐,且单词之间不插入额外的空格。
说明:
- 单词是指由非空格字符组成的字符序列。
- 每个单词的长度大于 0,小于等于 maxWidth。
- 输入单词数组
words
至少包含一个单词。
示例:
输入: 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 " ]
模拟题,比较坑的地方是如果只有一个单词,做除法可能除零了…其他地方倒没啥,模拟下随便乱搞…
static const auto _=[](){
std::ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
vector<string> fullJustify(vector<string>& words, int maxWidth) {
int i = 0;
vector<pair<int, int> > p_ans;
vector<int> p_len;
while (i < words.size()) {
int j = i;
int sum = 0;
int str_len = 0;
while (j < words.size()) {
if (words[j].length() <= maxWidth - sum) {
sum += (words[j].length() == maxWidth - sum ? words[j].length() : words[j].length() + 1);
str_len += words[j].length();
++j;
} else {
break;
}
}
p_ans.push_back( make_pair(i, j) );
p_len.push_back(str_len);
i = j;
}
vector<string> ans;
for (int i = 0; i < p_ans.size() - 1; ++i) {
string tmp_s;
if (p_ans[i].second - p_ans[i].first - 1 == 0) {
tmp_s += words[p_ans[i].first];
int cnt = maxWidth - tmp_s.length();
while (cnt--) {
tmp_s += " ";
}
ans.emplace_back(tmp_s);
continue;
}
int tmp = (maxWidth - p_len[i])/(p_ans[i].second - p_ans[i].first - 1);
int more = (maxWidth - p_len[i]) - tmp * (p_ans[i].second - p_ans[i].first - 1);
for (int j = p_ans[i].first; j < p_ans[i].second - 1; ++j) {
tmp_s += words[j];
int num = tmp;
while (num--) {
tmp_s += " ";
}
if (more > 0) {
tmp_s += " ";
--more;
}
}
tmp_s += words[p_ans[i].second - 1];
ans.emplace_back(tmp_s);
}
string tmp_s;
for (int j = p_ans[p_ans.size() - 1].first; j < p_ans[p_ans.size() - 1].second; ++j) {
tmp_s += words[j];
if (j != p_ans[p_ans.size() - 1].second - 1) {
tmp_s += " ";
}
}
int tmp_l = maxWidth - tmp_s.size();
while (tmp_l--) {
tmp_s += " ";
}
ans.emplace_back(tmp_s);
return ans;
}
};