alien dictionary

🏠
 1def alienOrder(words):
 2    ral = {c: [] for word in words for c in word}
 3    for first_word, second_word in zip(words, words[1:]):
 4        for c, d in zip(first_word, second_word):
 5            if c != d:
 6                ral[d].append(c)
 7                break
 8        else:
 9            if len(second_word) < len(first_word):
10                return ""
11
12    seen, output = {}, {"str": ""}
13
14    def visit(node):
15        if node in seen:
16            return seen.get(node, False)
17        for next_node in ral[node]:
18            result = visit(next_node)
19            if not result:
20                return False  # Cycle was detected lower down.
21        seen[node] = True
22        output["str"] += node
23        return True
24
25    return output["str"] if all(visit(node) for node in ral) else ""
26
27print(alienOrder(list(sorted("some text here".split()))))
graph TD h --> f l --> h n --> l p --> n b --> a r --> n e --> a l --> e r --> l i --> a y --> r c --> b r --> o d --> c i --> e v --> s o --> i e --> d f --> e e --> a i --> e g --> f o --> i e --> d h --> g n --> d s --> n e --> a l --> a r --> l i --> e o --> i i --> h t --> n k --> i l --> k o --> a i --> e f --> e k --> f l --> k t --> l m --> l r --> n e --> a i --> e o --> i l --> i y --> o o --> m f --> b l --> f n --> l p --> o l --> i e --> a s --> p e --> a x --> n i --> e n --> d o --> i t --> o u --> t g --> c t --> s o --> h v --> t w --> v e --> a h --> e i --> h t --> s o --> i y --> w

See Also:

accounts merge wip
shifted zip
generating callgraphs in python with mermaid