Hard
A transformation sequence from word beginWord
to word endWord
using a dictionary wordList
is a sequence of words beginWord -> s1 -> s2 -> ... -> sk
such that:
si
for 1 <= i <= k
is in wordList
. Note that beginWord
does not need to be in wordList
.sk == endWord
Given two words, beginWord
and endWord
, and a dictionary wordList
, return the number of words in the shortest transformation sequence from beginWord
to endWord
, or 0
if no such sequence exists.
Example 1:
Input: beginWord = “hit”, endWord = “cog”, wordList = [“hot”,”dot”,”dog”,”lot”,”log”,”cog”]
Output: 5
Explanation: One shortest transformation sequence is “hit” -> “hot” -> “dot” -> “dog” -> cog”, which is 5 words long.
Example 2:
Input: beginWord = “hit”, endWord = “cog”, wordList = [“hot”,”dot”,”dog”,”lot”,”log”]
Output: 0
Explanation: The endWord “cog” is not in wordList, therefore there is no valid transformation sequence.
Constraints:
1 <= beginWord.length <= 10
endWord.length == beginWord.length
1 <= wordList.length <= 5000
wordList[i].length == beginWord.length
beginWord
, endWord
, and wordList[i]
consist of lowercase English letters.beginWord != endWord
wordList
are unique.from typing import List, Set
class Solution:
def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int:
begin_set = set()
end_set = set()
word_set = set(wordList)
visited = set()
if endWord not in wordList:
return 0
length = 1
str_len = len(beginWord)
begin_set.add(beginWord)
end_set.add(endWord)
while begin_set and end_set:
if len(begin_set) > len(end_set):
begin_set, end_set = end_set, begin_set
temp_set = set()
for s in begin_set:
chars = list(s)
for i in range(str_len):
old = chars[i]
for j in range(ord('a'), ord('z') + 1):
chars[i] = chr(j)
temp = ''.join(chars)
if temp in end_set:
return length + 1
if temp not in visited and temp in word_set:
temp_set.add(temp)
visited.add(temp)
chars[i] = old
begin_set = temp_set
length += 1
return 0