from collections import defaultdict, Counter, deque def alien_order(words): adj_list = defaultdict(set) counts = Counter({c: 0 for word in words for c in word}) for word1, word2 in zip(words, words[1:]): for c, d in zip(word1, word2): if c != d: if d not in adj_list[c]: adj_list[c].add(d) counts[d] += 1 break else: if len(word2) < len(word1): return "" result = [] sources_queue = deque([c for c in counts if counts[c] == 0]) while sources_queue: c = sources_queue.popleft() result.append(c) for d in adj_list[c]: counts[d] -= 1 if counts[d] == 0: sources_queue.append(d) if len(result) < len(counts): return "" return "".join(result) # Driver code def main(): words = [ ["mzosr", "mqov", "xxsvq", "xazv", "xazau", "xaqu", "suvzu", "suvxq", "suam", "suax", "rom", "rwx", "rwv"], ["vanilla", "alpine", "algor", "port", "norm", "nylon", "ophellia", "hidden"], ["passengers", "to", "the", "unknown"], ["alpha", "bravo", "charlie", "delta"], ["jupyter", "ascending"]] for i in range(len(words)): print(i + 1, ".\twords = ", words[i], sep="") print("\tDictionary = \"", alien_order(words[i]), "\"", sep="") print("-"*100) if __name__ == "__main__": main()