# Solution For Alien Dictionary

Problem description:

There is a new alien language that uses the English alphabet, but the order of the letters is unknown to you. You are given a list of words from the dictionary, where words are sorted lexicographically by the rules of this new language. Derive the order of the alphabet from the dictionary.

Solution:

The given problem can be solved using Topological Sort of Graph. We can consider each character of the word as a vertex. For each pair of words, if the corresponding characters at the same position are different, we can connect an edge from the character of the first word to the character of the second word. We can create a directed graph where each vertex represents a character, and the edge represents the order of the character.

Next, we can perform a Topological Sort of the vertices of the graph to compute the order of the alphabet. Topological Sort is an algorithm that takes a directed acyclic graph (DAG) as input and returns a linear ordering of its vertices. The linear ordering is such that for every directed edge (u, v) from vertex u to vertex v, u comes before v in the ordering.

Algorithm:

- Create a directed graph for the characters in the input dictionary words.
- Perform Topological Sort on the graph to get the order of characters.
- Return the order of characters as the alphabet order.

Code:

Let’s try to implement the above algorithm in Python:

from collections import defaultdict, deque

class Solution:

def alienOrder(self, words: List[str]) -> str:

# Create directed graph of characters

graph = defaultdict(set)

indegree = defaultdict(int)

for i in range(len(words)-1):

word1, word2 = words[i], words[i+1]
for j in range(min(len(word1), len(word2))):

if word1[j] == word2[j]:

continue

if word2[j] not in graph[word1[j]]:

graph[word1[j]].add(word2[j])

indegree[word2[j]] += 1

break

else:

if len(word1) > len(word2):

return “”

# Perform Topological Sort

order = []
queue = deque([c for c in indegree if indegree[c] == 0])

while queue:

curr = queue.popleft()

order.append(curr)

for neighbor in graph[curr]:

indegree[neighbor] -= 1

if indegree[neighbor] == 0:

queue.append(neighbor)

if len(order) == len(indegree):

return “”.join(order)

return “”

Time Complexity: O(N), where N is the total number of characters in all words.

Space Complexity: O(26) = O(1), as the input contains only lowercase letters of English alphabet.

Example:

Input: words = [“wrt”,”wrf”,”er”,”ett”,”rftt”] Output: “wertf”

## Step by Step Implementation For Alien Dictionary

There are multiple ways to solve this problem. One way would be to use a topological sort. 1. Create a graph with the aliens as nodes and the relationships between them as edges. 2. Perform a topological sort on the graph. 3. Output the sorted order of the aliens.

def alienOrder(words): # 1. Create a empty graph graph = {} # 2. In the case that we have an empty input if not words: return [] # 3. Add all the vertices into the graph for word in words: for char in word: if char not in graph: graph[char] = set() # 4. Add all the edges into the graph # We assume that the first word is always smaller than the second word # in the dictionary for i in range(len(words) - 1): # Find the first different character between the current word and the next word j = 0 while j < len(words[i]) and j < len(words[i + 1]) and words[i][j] == words[i + 1][j]: j += 1 # Add the edge from the current character to the next character if j < len(words[i]) and j < len(words[i + 1]): graph[words[i][j]].add(words[i + 1][j]) # 5. Topological sort # Initialize the inputs for topological sort # visited: default value False, indicates if the node has been visited # stack: used to store the order of the characters visited = {char: False for char in graph} stack = [] # Call the recursive helper function def topological_sort(char): # Mark the current node as visited visited[char] = True # Recurse on all of its neighbors for neighbor in graph[char]: if not visited[neighbor]: topological_sort(neighbor) # Add the current node to the stack stack.append(char) # Do the recursive sort for char in graph: if not visited[char]: topological_sort(char) # 6. Return the order return "".join(stack[::-1])

There are multiple ways to solve this problem. One approach would be to use a topological sort. We can create a graph where each node represents a character and an edge represents a dependency between two characters. In other words, if character A comes before character B in the dictionary, then there will be an edge from A to B in the graph. We can then use a topological sort to find the order of the characters in the dictionary. Here is some pseudocode for this approach: 1. Create a graph with characters as nodes and dependencies as edges. 2. Perform a topological sort on the graph. 3. Output the characters in the order determined by the topological sort.

There are multiple ways to solve this problem. One approach would be to use a topological sort. First, we need to build a graph of the dependencies between the different characters. We can do this by scanning through the words in the dictionary and, for each pair of adjacent words, comparing the characters at each position. If we find a difference, we add an edge from the character at the first word to the character at the second word. Once we have built the graph, we can perform a topological sort on it to find an ordering of the characters that satisfies the dependencies. Here is some pseudocode for this approach: 1. Build graph by scanning through dictionary and adding edges for each pair of adjacent words. 2. Perform topological sort on graph. 3. Output the ordering of characters from the topological sort.

public class Solution { public string AlienOrder(string[] words) { // TODO: Implement your solution here } }