[
graph
string
topological sort
]
Leetcode 0269. Alien Dictionary
Problem statement
https://leetcode.com/problems/alien-dictionary/
Solution
The idea is to use topological sort. Let us traverse all pairs of adjacent words, for example if we have aylksga and aymst, we can state that l must go before m. Also we need to check that if we have case like agsag and ags, than no matter what happens else, answer will always be false. After we create our connections graph, we need to perform dfs with $3$ colors for all components. In the end if we found loop, return "", and if we did not, return reversed order.
Complexity
Time complexity is $O(m)$, where $m$ is total length of all words, this part will be bigger than dfs part. Space complexity is $O(d + \min(d^2, n))$, where $d$ is the size of alphabet and $n$ is lenght of words.
Code
class Solution:
def alienOrder(self, words):
def dfs(node):
if visited[node] == 1:
self.FoundCycle = 1
if visited[node] == 0:
visited[node] = 1
for neib in graph[node]: dfs(neib)
visited[node] = 2
self.ans += node
exist, visited = set("".join(words)), Counter()
self.ans, self.FoundCycle = "", 0
graph = defaultdict(list)
for w1, w2 in zip(words, words[1:]):
for i, j in zip(w1, w2):
if i != j:
graph[i].append(j)
break
if w1.startswith(w2) and w1 != w2: return ""
for i in exist:
if visited[i] == 0: dfs(i)
if self.FoundCycle == 1: return ""
return self.ans[::-1]