题目地址:
https://leetcode.com/problems/text-justification/
给定一个字符串数组 A A A,再给定一个正整数 w w w,要求对这些字符串排版, w w w表示每行的最大宽度,题目保证 w w w大于等于最长字符串的长度。在排版的时候,单词之间以空格隔开,并且要求每行的单词数尽可能多,左对齐,并且单词之间的空格数尽可能平均;如果无法做到平均,则要求靠左的空格比靠右的空格数多 1 1 1;对于最后一行我们特殊处理,直接要求其左对齐,并且右边补齐空格到宽度 w w w。输出排版完成之后每行是什么。
思路如下,我们分为两种情况考虑,一种是左对齐,并且间隔 1 1 1个空格,另一种是存在间隔多个空格的情形。
先求一下当前行能放多少个字符串,如果当前行只能放一个字符串或者当前行放完了所有字符串,则需要采取左对齐的方式,并且间隔的空格数为 1 1 1,于是把这些字符串中间隔开空格append起来,就成为当前行的结果;
如果不是,则说明间隔空格数可能不是 1 1 1个,此时算一下当前行的总空格数,除以当前行的间隔数,那么除出来的结果其实就是靠左的空格间隔是多长,比如是 s s s,但是我们还需要求出长 s + 1 s+1 s+1的间隔有多少个,这可以通过让总空格数对间隔数取余得到。
代码如下:
class Solution {
public:
vector<string> fullJustify(vector<string>& words, int maxWidth) {
vector<string> res;
for (int i = 0; i < words.size(); i++) {
int len = words[i].size(), j = i + 1;
while (j < words.size() && len + 1 + words[j].size() <= maxWidth)
len += 1 + words[j++].size();
int cnt = j - i;
string s = words[i];
if (cnt == 1 || j == words.size()) {
for (int k = i + 1; k < j; k++) s += " " + words[k];
s.insert(s.end(), maxWidth - s.size(), ' ');
} else {
int len_sp = (maxWidth - len + cnt - 1) / (cnt - 1);
for (int k = i + 1, l = 0; k < j; k++, l++) {
s.insert(s.end(), len_sp, ' ');
if (l < (maxWidth - len + cnt - 1) % (cnt - 1)) s += ' ';
s += words[k];
}
}
res.push_back(s);
i = j - 1;
}
return res;
}
};
时空复杂度 O ( n ) O(n) O(n), n n n为最终的文本长度。