说明:
单词是指由非空格字符组成的字符序列。 每个单词的长度大于 0,小于等于 maxWidth。 输入单词数组 words 至少包含一个单词。
示例
示例:
1 2 3 4 5 6 7 8 9
输入: words = ["This", "is", "an", "example", "of", "text", "justification."] maxWidth = 16 输出: [ "This is an", "example of text", "justification. " ]
示例 2:
1 2 3 4 5 6 7 8 9
输入: words = ["What","must","be","acknowledgment","shall","be"] maxWidth = 16 输出: [ "What must be", "acknowledgment ", "shall be " ]
解释: 注意最后一行的格式应为 "shall be " 而不是 "shall be",
因为最后一行应为左对齐,而不是左右两端对齐。 第二行同样为左对齐,这是因为这行只包含一个单词。
示例 3:
1 2 3 4 5 6 7 8 9 10 11 12 13
输入: 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 " ]
考察知识点
字符串、贪心算法
核心思想
首先要理顺题意,给定一堆单词,让你放在固定长度字符串里,有三个要点要注意:
1、两个单词之间至少有一个空格,如果单词加空格长度超过maxWidth,说明该单词放不下,比如示例1:当我们保证this is an 再加入example变成this is an example总长度超过maxWidth,所以这一行只能放下thisisan 这三个单词。
2、this is an长度小于maxWidth,考虑分配空格,当不能保证每个间隔的空格数目一样多的时候,多出来的空格从左往右依次向每个间隔添加1个,靠近右边的一部分空格,可能就添加不上了,这样一来就保证了左边空格数大于右边的。
3、最后一行,要尽量靠左,例如示例2的:"shall be "。
classSolution: deffullJustify(self, words: List[str], maxWidth: int) -> List[str]: res = [] n = len(words) i = 0
defone_row_words(i): # 至少 一行能放下一个单词, cur_row_len left = i cur_row_len = len(words[i]) i += 1 while i < n: # 当目前行 加上一个单词长度 再加一个空格 if cur_row_len + len(words[i]) + 1 > maxWidth: break cur_row_len += len(words[i]) + 1 i += 1 return left, i
while i < n: left, i = one_row_words(i) # 该行几个单词获取 one_row = words[left:i] # 如果是最后一行了 if i == n : res.append(" ".join(one_row).ljust(maxWidth," ")) break # 所有单词的长度 all_word_len = sum(len(i) for i in one_row) # 至少空格个数 space_num = i - left - 1 # 可以为空格的位置 remain_space = maxWidth - all_word_len # 单词之间至少几个空格,还剩几个空格没用 if space_num: a, b = divmod(remain_space, space_num) # print(a,b) # 该行字符串拼接 tmp = "" for word in one_row: if tmp: tmp += " " * a if b: tmp += " " b -= 1 tmp += word #print(tmp, len(tmp)) res.append(tmp.ljust(maxWidth, " ")) return res