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 == endWordGiven 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 <= 10endWord.length == beginWord.length1 <= wordList.length <= 5000wordList[i].length == beginWord.lengthbeginWord, endWord, and wordList[i] consist of lowercase English letters.beginWord != endWordwordList 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