TGViewer
Swift | LeetCode Swift | LeetCode @easy_swift_task · 1.3K subscribers
Post #1122 104
Задача: 68. Text Justification
Сложность: hard

Дан массив строк words и ширина maxWidth. Необходимо отформатировать текст таким образом, чтобы каждая строка содержала ровно maxWidth символов и была полностью (слева и справа) выровнена.

Слова следует упаковывать жадным способом; то есть стараться поместить как можно больше слов в каждую строку. Дополнительные пробелы ' ' следует добавлять по мере необходимости, чтобы каждая строка имела ровно maxWidth символов.

Дополнительные пробелы между словами должны распределяться как можно более равномерно. Если количество пробелов в строке не делится поровну между словами, то пустые места слева будут содержать больше пробелов, чем места справа.

Для последней строки текста выравнивание должно быть по левому краю, и между словами не добавляются дополнительные пробелы.

Примечание:
Слово определяется как последовательность символов, не содержащих пробелы.
Длина каждого слова гарантированно больше 0 и не превышает maxWidth.
Входной массив words содержит хотя бы одно слово.

Пример:
Input: words = ["This", "is", "an", "example", "of", "text", "justification."], maxWidth = 16
Output:
[
"This is an",
"example of text",
"justification. "
]


👨‍💻 Алгоритм:

1⃣Создайте два вспомогательных метода getWords и createLine, описанные выше.

2⃣Инициализируйте список ответов ans и целочисленную переменную i для итерации по входным данным. Используйте цикл while для перебора входных данных. Каждая итерация в цикле while будет обрабатывать одну строку в ответе.

3⃣Пока i < words.length, выполните следующие шаги:
Получите слова, которые должны быть в текущей строке, как currentLine = getWords(i).
Увеличьте i на currentLine.length.
Создайте строку, вызвав createLine(line, i), и добавьте её в ans.
Верните ans.

😎 Решение:
func fullJustify(_ words: [String], _ maxWidth: Int) -> [String] {
var ans = [String]()
var i = 0

while i < words.count {
let currentLine = getWords(&i, words, maxWidth)
ans.append(createLine(currentLine, i, words, maxWidth))
}
return ans

func getWords(_ i: inout Int, _ words: [String], _ maxWidth: Int) -> [String] {
var currentLine = [String]()
var currLength = 0
while i < words.count && currLength + words[i].count <= maxWidth {
currentLine.append(words[i])
currLength += words[i].count + 1
i += 1
}
return currentLine
}

func createLine(_ line: [String], _ i: Int, _ words: [String], _ maxWidth: Int) -> String {
var baseLength = -1
for word in line {
baseLength += word.count + 1
}
let extraSpaces = maxWidth - baseLength
var result = line
if line.count == 1 || i == words.count {
return line.joined(separator: " ") + String(repeating: " ", count: extraSpaces)
}
let wordCount = line.count - 1
let spacesPerWord = extraSpaces / wordCount
let needsExtraSpace = extraSpaces % wordCount
for j in 0..<needsExtraSpace {
result[j] += " "
}
for j in 0..<wordCount {
result[j] += String(repeating: " ", count: spacesPerWord)
}
return result.joined(separator: " ")
}
}


Ставь 👍 и забирай 📚 Базу знаний
More from @easy_swift_task
  1. Oct 13, 2026Задача: 786. K-th Smallest Prime Fraction Сложность: medium Вам дан отсортированный массив…
  2. Oct 11, 2026Задача: 1325. Delete Leaves With a Given Value Сложность: medium Дано корневое дерево root…
  3. Oct 7, 2026🔥 Скрытые вакансии с удаленной работой для iOS разработчика, которые нигде больше не публ…
  4. Oct 4, 2026Задача: 523. Continuous Subarray Sum Сложность: medium Дан целочисленный массив nums и цел…
  5. Oct 4, 2026Задача: 1329. Sort the Matrix Diagonally Сложность: medium Диагональ матрицы — это диагона…
  6. Oct 3, 2026Задача: 200. Number of Islands Сложность: medium Дана двумерная бинарная сетка размером m…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →