题目: 文本左右对齐
来自智得网
分析
方法一:暴力枚举
这个方法很简单,我们对于每一行,先从当前位置开始尽可能多的放单词,然后计算额外需要填充的空格,再填充空格即可。
具体的实现细节可以参考以下Python代码:
class Solution:
def fullJustify(self, words: List[str], maxWidth: int) -> List[str]:
ans = []
n = len(words)
i = 0
while i < n:
line_words = []
cur_len = 0
# 尝试添加单词,直到一行无法再添加为止
while i < n and cur_len + len(words[i]) + len(line_words) <= maxWidth:
line_words.append(words[i])
cur_len += len(words[i])
i += 1
# 计算需要填充的空格数量
spaces = maxWidth - cur_len
slots = len(line_words) - 1
if slots == 0 or i == n:
# 特殊处理只有一个单词或者最后一行的情况
ans.append(" ".join(line_words).ljust(maxWidth))
else:
# 普通情况
min_space = spaces // slots
extra_space = spaces % slots
line = ""
for j, word in enumerate(line_words):
if j > 0:
line += " " * min_space
if j <= extra_space:
line += " "
line += word
ans.append(line)
return ans
这个方法的时间复杂度是$O(n^2)$,其中$n$是单词数量。因为我们对于每个单词都要计算一遍是否能放进当前行,所以时间复杂度比较高。不过这个方法非常简单易懂,而且空间复杂度是$O(1)$。
方法二:一次遍历
我们可以在一次遍历中解决这个问题。具体来说,我们先把所有的单词按照顺序存储在一个列表里,然后遍历列表,对于每个单词,我们都尽量把它放到当前行中。如果当前行无法再添加单词,那么我们就将这一行处理成对齐的形式,并将其加入答案列表中。
具体的实现可以参考以下Python代码: