hard Alien Dictionary
Problem Statement
There is a dictionary containing words from an alien language for which we don’t know the ordering of the letters.
Given a list of strings words from the alien language's dictionary. All strings in words are sorted lexicographically by the rules of this new language.
Return a string of the unique letters in the new alien language sorted in lexicographically increasing order by the new language's rules.
It is given that the input is a valid dictionary and there exists an ordering among its letters.
Example 1:
Input: Words: ["ba", "bc", "ac", "cab"]
Output: bac
Explanation: Given that the words are sorted lexicographically by the rules of the alien language, so
from the given words we can conclude the following ordering among its characters:
1. From "ba" and "bc", we can conclude that 'a' comes before 'c'.
2. From "bc" and "ac", we can conclude that 'b' comes before 'a'
From the above two points, we can conclude that the correct character order is: "bac"
Example 2:
Input: Words: ["cab", "aaa", "aab"]
Output: cab
Explanation: From the given words we can conclude the following ordering among its characters:
1. From "cab" and "aaa", we can conclude that 'c' comes before 'a'.
2. From "aaa" and "aab", we can conclude that 'a' comes before 'b'
From the above two points, we can conclude that the correct character order is: "cab"
Example 3:
Input: Words: ["ywx", "wz", "xww", "xz", "zyy", "zwz"]
Output: ywxz
Explanation: From the given words we can conclude the following ordering among its characters:
1. From "ywx" and "wz", we can conclude that 'y' comes before 'w'.
2. From "wz" and "xww", we can conclude that 'w' comes before 'x'.
3. From "xww" and "xz", we can conclude that 'w' comes before 'z'
4. From "xz" and "zyy", we can conclude that 'x' comes before 'z'
5. From "zyy" and "zwz", we can conclude that 'y' comes before 'w'
From the above five points, we can conclude that the correct character order is: "ywxz"
Constraints:
1 <= words.length <= 1001 <= words[i].length <= 100words[i]consists of only lowercase English letters.
Try it yourself
Try solving this question here:
✅ Solution Alien Dictionary
Problem Statement
There is a dictionary containing words from an alien language for which we don’t know the ordering of the letters.
Given a list of strings words from the alien language's dictionary. All strings in words are sorted lexicographically by the rules of this new language.
Return a string of the unique letters in the new alien language sorted in lexicographically increasing order by the new language's rules.
It is given that the input is a valid dictionary and there exists an ordering among its letters.
Example 1:
Input: Words: ["ba", "bc", "ac", "cab"]
Output: bac
Explanation: Given that the words are sorted lexicographically by the rules of the alien language, so
from the given words we can conclude the following ordering among its characters:
1. From "ba" and "bc", we can conclude that 'a' comes before 'c'.
2. From "bc" and "ac", we can conclude that 'b' comes before 'a'
From the above two points, we can conclude that the correct character order is: "bac"
Example 2:
Input: Words: ["cab", "aaa", "aab"]
Output: cab
Explanation: From the given words we can conclude the following ordering among its characters:
1. From "cab" and "aaa", we can conclude that 'c' comes before 'a'.
2. From "aaa" and "aab", we can conclude that 'a' comes before 'b'
From the above two points, we can conclude that the correct character order is: "cab"
Example 3:
Input: Words: ["ywx", "wz", "xww", "xz", "zyy", "zwz"]
Output: ywxz
Explanation: From the given words we can conclude the following ordering among its characters:
1. From "ywx" and "wz", we can conclude that 'y' comes before 'w'.
2. From "wz" and "xww", we can conclude that 'w' comes before 'x'.
3. From "xww" and "xz", we can conclude that 'w' comes before 'z'
4. From "xz" and "zyy", we can conclude that 'x' comes before 'z'
5. From "zyy" and "zwz", we can conclude that 'y' comes before 'w'
From the above five points, we can conclude that the correct character order is: "ywxz"
Constraints:
1 <= words.length <= 1001 <= words[i].length <= 100words[i]consists of only lowercase English letters.
Solution
Since the given words are sorted lexicographically by the rules of the alien language, we can always compare two adjacent words to determine the ordering of the characters. Take Example-1 above: [“ba”, “bc”, “ac”, “cab”]
-
Take the first two words “ba” and “bc”. Starting from the beginning of the words, find the first character that is different in both words: it would be ‘a’ from “ba” and ‘c’ from “bc”. Because of the sorted order of words (i.e. the dictionary!), we can conclude that ‘a’ comes before ‘c’ in the alien language.
-
Similarly, from “bc” and “ac”, we can conclude that ‘b’ comes before ‘a’. These two points tell us that we are actually asked to find the topological ordering of the characters, and that the ordering rules should be inferred from adjacent words from the alien dictionary.
This makes the current problem similar to Tasks Scheduling Order, the only difference being that we need to build the graph of the characters by comparing adjacent words first, and then perform the topological sort for the graph to determine the order of the characters.
Code
Here is what our algorithm will look like:
import java.util.*;
class Solution {
public String findOrder(String[] words) {
if (words == null || words.length == 0) return "";
// a. Initialize the graph
HashMap<Character, Integer> inDegree = new HashMap<>(); // count of incoming edges for every vertex
HashMap<Character, List<Character>> graph = new HashMap<>(); // adjacency list graph
for (String word : words) {
for (char character : word.toCharArray()) {
inDegree.put(character, 0);
graph.put(character, new ArrayList<Character>());
}
}
// b. Build the graph
for (int i = 0; i < words.length - 1; i++) {
// find ordering of characters from adjacent words
String w1 = words[i], w2 = words[i + 1];
for (int j = 0; j < Math.min(w1.length(), w2.length()); j++) {
char parent = w1.charAt(j), child = w2.charAt(j);
if (parent != child) { // if the two characters are different
graph.get(parent).add(child); // put the child into it's parent's list
inDegree.put(child, inDegree.get(child) + 1); // increment child's inDegree
break; // only the first different character between the two words will help
// us find the order
}
}
}
// c. Find all sources i.e., all vertices with 0 in-degrees
Queue<Character> sources = new LinkedList<>();
for (Map.Entry<Character, Integer> entry : inDegree.entrySet()) {
if (entry.getValue() == 0) sources.add(entry.getKey());
}
// d. For each source, add it to the sortedOrder and subtract one from all of its
// children's in-degrees if a child's in-degree becomes zero, add it to sources queue
StringBuilder sortedOrder = new StringBuilder();
while (!sources.isEmpty()) {
Character vertex = sources.poll();
sortedOrder.append(vertex);
// get the node's children to decrement their in-degrees
List<Character> children = graph.get(vertex);
for (Character child : children) {
inDegree.put(child, inDegree.get(child) - 1);
if (inDegree.get(child) == 0) sources.add(child);
}
}
// if sortedOrder doesn't contain all characters, there is a cyclic dependency
// between characters, therefore, we will not be able to find the correct ordering
// of the characters
if (sortedOrder.length() != inDegree.size()) return "";
return sortedOrder.toString();
}
public static void main(String[] args) {
Solution sol = new Solution();
String result = sol.findOrder(new String[] { "ba", "bc", "ac", "cab" });
System.out.println("Character order: " + result);
result = sol.findOrder(new String[] { "cab", "aaa", "aab" });
System.out.println("Character order: " + result);
result = sol.findOrder(
new String[] { "ywx", "wz", "xww", "xz", "zyy", "zwz" }
);
System.out.println("Character order: " + result);
}
}
Time Complexity
In step ‘d’, each task can become a source only once and each edge (a rule) will be accessed and removed once. Therefore, the time complexity of the above algorithm will be
Space Complexity
The space complexity will be
🤖 Don't fully get this? Learn it with Claude
Stuck on Alien Dictionary? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.
Progressively stronger hints — you still solve it.
I'm working on the problem **Alien Dictionary** (DSA). Give me a HINT LADDER: start with the tiniest nudge, then wait. Only reveal the next, stronger hint when I ask. Do NOT show the full solution unless I type 'show solution'. Keep me doing the thinking. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
See the technique, not just code.
Explain the optimal approach to **Alien Dictionary** with a VISUAL walkthrough: trace it on a small concrete example using ASCII art / a step-by-step diagram, narrate what changes each step, then give time & space complexity with a one-line derivation. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Catch bugs, edge cases, sub-optimality.
I'll paste my solution to **Alien Dictionary**. Review it for correctness, missed edge cases, and time/space complexity, then coach me toward the optimal — don't just rewrite it. Ask me to paste my code now. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
Lock in recognition with look-alikes.
Give me 2 problems that use the SAME underlying pattern as **Alien Dictionary**. For each, let me attempt first, then review my answer and name the trigger signal that reveals the pattern. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.