Advanced Graphs
Java solutions with explanations, time and space complexity for Advanced Graphs problems from Blind 75.
Advanced Graphs
This section covers advanced graph algorithms and problems.
1. Alien Dictionary (Hard)
Problem: There is a new alien language that uses the English alphabet. However, the order among the letters is unknown to you.
You are given a list of strings words
from the alien language’s dictionary, where the 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. If there is no solution, return ""
. If there are multiple solutions, return any of them.
Example:
Input: words = ["wrt","wrf","er","ett","rftt"]
Output: "wertf"
Solution:
class Solution {
public String alienOrder(String[] words) {
Map<Character, Set<Character>> graph = new HashMap<>();
Map<Character, Integer> inDegree = new HashMap<>();
// Initialize
for (String word : words) {
for (char c : word.toCharArray()) {
graph.putIfAbsent(c, new HashSet<>());
inDegree.putIfAbsent(c, 0);
}
}
// Build graph
for (int i = 0; i < words.length - 1; i++) {
String word1 = words[i], word2 = words[i + 1];
if (word1.length() > word2.length() && word1.startsWith(word2)) {
return "";
}
for (int j = 0; j < Math.min(word1.length(), word2.length()); j++) {
char c1 = word1.charAt(j), c2 = word2.charAt(j);
if (c1 != c2) {
if (!graph.get(c1).contains(c2)) {
graph.get(c1).add(c2);
inDegree.put(c2, inDegree.get(c2) + 1);
}
break;
}
}
}
// Topological sort
Queue<Character> queue = new LinkedList<>();
for (char c : inDegree.keySet()) {
if (inDegree.get(c) == 0) {
queue.offer(c);
}
}
StringBuilder result = new StringBuilder();
while (!queue.isEmpty()) {
char c = queue.poll();
result.append(c);
for (char neighbor : graph.get(c)) {
inDegree.put(neighbor, inDegree.get(neighbor) - 1);
if (inDegree.get(neighbor) == 0) {
queue.offer(neighbor);
}
}
}
return result.length() == inDegree.size() ? result.toString() : "";
}
}
Time Complexity: O(C) where C is the total number of characters Space Complexity: O(1) since alphabet size is fixed
Key Takeaways
- Topological Sort: Use for dependency resolution in graphs
- Cycle Detection: Check for cycles in directed graphs
- Lexicographic Order: Build graph from word comparisons
- Indegree Tracking: Use for topological sorting