Faaez Razeen

Word Ladder

  • 3 min read
  • Graph
  • LC-Hard

3 years ago

Solution

defaultdict(<class 'list'>, {'*it': ['hit'], 'h*t': ['hit', 'hot'], 'hi*': ['hit'], '*og': ['cog', 'dog', 'log', 'cog'], 'c*g': ['cog', 'cog'], 'co*': ['cog', 'cog'], '*ot': ['hot', 'dot', 'lot'], 'ho*': ['hot'], 'd*t': ['dot'], 'do*': ['dot', 'dog'], 'd*g': ['dog'], 'l*t': ['lot'], 'lo*': ['lot', 'log'], 'l*g': ['log']})
TimeSpaceExplanation
O()O()
def getWildstarWords(self, word): wildstar_words = [] for i in range(len(word)): wildstar_word = word[:i] + '*' + word[i + 1:] wildstar_words.append(wildstar_word) return wildstar_words def getWordNeighbours(self, adj, word): neighbours = [] for wildstar_word in self.getWildstarWords(word): for word in adj[wildstar_word]: neighbours.append(word) return neighbours def ladderLength(self, beginWord: str, endWord: str, wordList: List[str]) -> int: if endWord not in wordList: return 0 adj = defaultdict(list) for word in [beginWord] + [endWord] + wordList: for wildstar_word in self.getWildstarWords(word): adj[wildstar_word].append(word) q = deque([beginWord]) levels = 0 vis = set() while q: levels += 1 for _ in range(len(q)): word = q.popleft() if word == endWord: return levels vis.add(word) for word_neighbour in self.getWordNeighbours(adj, word): if word_neighbour not in vis: q.append(word_neighbour) return 0 # If code reached here then it means that the end word wasn't found, so return 0