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.func ladderLength(beginWord string, endWord string, wordList []string) int {
wordSet := make(map[string]bool)
for _, word := range wordList {
wordSet[word] = true
}
if !wordSet[endWord] {
return 0
}
beginSet := make(map[string]bool)
endSet := make(map[string]bool)
visited := make(map[string]bool)
beginSet[beginWord] = true
endSet[endWord] = true
lenght := 1
strLen := len(beginWord)
for len(beginSet) > 0 && len(endSet) > 0 {
if len(beginSet) > len(endSet) {
beginSet, endSet = endSet, beginSet
}
tempSet := make(map[string]bool)
for s := range beginSet {
chars := []byte(s)
for i := 0; i < strLen; i++ {
old := chars[i]
for j := byte('a'); j <= 'z'; j++ {
chars[i] = j
temp := string(chars)
if endSet[temp] {
return lenght + 1
}
if !visited[temp] && wordSet[temp] {
tempSet[temp] = true
visited[temp] = true
}
}
chars[i] = old
}
}
beginSet = tempSet
lenght++
}
return 0
}