Faaez Razeen

Alien Dictionary

  • 4 min read
  • Graph
  • LC-Hard

3 years ago

Solution

adj = defaultdict(set) for i in range(len(words) - 1): w1, w2 = words[i], words[i + 1] min_len = min(len(w1), len(w2)) if len(w1) > len(w2) and w1[:min_len] == w2[:min_len]: return '' for j in range(min_len): if w1[j] != w2[j]: adj[w1[j]].add(w2[j]) break

The next part of the code is the graph traversal

def dfs(node): if node in visiting: return False if node in visited: return True visiting.add(node) for nbr in adj[node]: if not dfs(nbr): return False visited.add(node) path.append(node) visiting.remove(node) return True for ch in set(''.join(words)): if not dfs(ch): return '' return ''.join(path[::-1])
TimeSpaceExplanation
O()O()
def alienOrder(self, words: List[str]) -> str: adj = defaultdict(set) for i in range(len(words) - 1): w1, w2 = words[i], words[i + 1] min_len = min(len(w1), len(w2)) if len(w1) > len(w2) and w1[:min_len] == w2[:min_len]: return '' for j in range(min_len): if w1[j] != w2[j]: adj[w1[j]].add(w2[j]) break visited, visiting, path = set(), set(), [] def dfs(node): if node in visiting: return False if node in visited: return True visiting.add(node) for nbr in adj[node]: if not dfs(nbr): return False visited.add(node) path.append(node) visiting.remove(node) return True for ch in set(''.join(words)): if not dfs(ch): return '' return ''.join(path[::-1])