package problems.medium; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Created by sherxon on 5/20/17. */ public class AlienAlphabet { static public List<Character> getABC(List<String> dict) { List<Character> alphabet = new ArrayList<>(); if (dict == null || dict.size() == 0) { return alphabet; } Map<Character, Set<Character>> graph = new HashMap<>(); char parent = dict.get(0).charAt(0); char parentCopy = dict.get(0).charAt(0); for (int j = 0; j < dict.size(); j++) { String s = dict.get(j); for (int i = 0; i < s.length(); i++) { char current = s.charAt(i); if (parent == current) { continue; } if (!graph.containsKey(parent)) { graph.put(parent, new HashSet<>()); } graph.get(parent).add(current); parent = current; } parent = s.charAt(0); } topSort(graph, parentCopy, alphabet, new HashSet<>()); Collections.reverse(alphabet); return alphabet; } static private void topSort(Map<Character, Set<Character>> graph, char source, List<Character> alphabet, HashSet<Character> visited) { visited.add(source); if (graph.containsKey(source)) { for (Character nei : graph.get(source)) { if (!visited.contains(nei)) { topSort(graph, nei, alphabet, visited); } } } alphabet.add(source); } }