TGViewer
Swift | LeetCode Swift | LeetCode @easy_swift_task · 1.3K subscribers
Post #1188 143
Задача: 126.Word Ladder II
Сложность: Hard


Последовательность преобразований от слова beginWord до слова endWord с использованием словаря wordList — это последовательность слов beginWord -> s1 -> s2 -> ... -> sk, для которой выполняются следующие условия:

Каждая пара соседних слов отличается ровно одной буквой.
Каждое si для 1 <= i <= k находится в wordList. Отметим, что beginWord не обязательно должно быть в wordList.
sk == endWord.
Для двух слов, beginWord и endWord, и словаря wordList, вернуть все самые короткие последовательности преобразований от beginWord до endWord или пустой список, если такая последовательность не существует. Каждая последовательность должна возвращаться в виде списка слов [beginWord, s1, s2, ..., sk].

Пример:
Input: beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
Output: [["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"]]
Explanation: There are 2 shortest transformation sequences:
"hit" -> "hot" -> "dot" -> "dog" -> "cog"
"hit" -> "hot" -> "lot" -> "log" -> "cog"


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

1⃣Сохранение слов из списка слов (wordList) в хэш-таблицу (unordered set) для эффективного удаления слов в процессе поиска в ширину (BFS).

2⃣Выполнение BFS, добавление связей в список смежности (adjList). После завершения уровня удалять посещенные слова из wordList.

3⃣Начать с beginWord и отслеживать текущий путь как currPath, просматривать все возможные пути, и когда путь ведет к endWord, сохранять путь в shortestPaths.

😎 Решение:
class Solution {
var adjList = [String: [String]]()
var shortestPaths = [[String]]()

func findLadders(_ beginWord: String, _ endWord: String, _ wordList: [String]) -> [[String]] {
var wordSet = Set(wordList), queue = [beginWord]
var isEnqueued = [beginWord: true]
while !queue.isEmpty {
var visited = [String]()
for currWord in queue {
queue.removeFirst()
for i in 0..<currWord.count {
var wordArray = Array(currWord)
let oldChar = wordArray[i]
for c in Character("a").asciiValue!...Character("z").asciiValue! {
wordArray[i] = Character(UnicodeScalar(c))
let newWord = String(wordArray)
if newWord == currWord || !wordSet.contains(newWord) { continue }
visited.append(newWord)
adjList[newWord, default: []].append(currWord)
if !isEnqueued[newWord, default: false] {
queue.append(newWord)
isEnqueued[newWord] = true
}
}
wordArray[i] = oldChar
}
}
visited.forEach { wordSet.remove($0) }
}

func backtrack(_ path: [String], _ word: String) {
if word == endWord {
shortestPaths.append(path.reversed())
return
}
for neighbor in adjList[word, default: []] {
backtrack(path + [neighbor], neighbor)
}
}

backtrack([beginWord], beginWord)
return shortestPaths
}
}


Ставь 👍 и забирай 📚 Базу знаний
  • 🔥 1
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 →