LeetCode Top Interview 150

127. Word Ladder

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:

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:

Solution

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