1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| class Solution { public String alienOrder(String[] words) { Map<Character, Set<Character>> nodeToNodeSetMap = new HashMap<>(); for (String word : words) { for (int i = 0; i < word.length(); i++) { nodeToNodeSetMap.putIfAbsent(word.charAt(i), new HashSet<>()); } }
for (int i = 0; i < words.length - 1; i++) { String from = words[i], to = words[i + 1]; boolean equals = true; for (int j = 0; j < Math.min(from.length(), to.length()); j++) { char f = from.charAt(j), t = to.charAt(j); if (f != t) { nodeToNodeSetMap.get(f).add(t); equals = false; break; } }
if (equals && from.length() > to.length()) { return ""; } }
Map<Character, Integer> inDegreeMap = new HashMap<>(); for (Map.Entry<Character, Set<Character>> entry : nodeToNodeSetMap.entrySet()) { char from = entry.getKey(); inDegreeMap.putIfAbsent(from, 0); Set<Character> toSet = entry.getValue(); for (char to : toSet) { inDegreeMap.put(to, inDegreeMap.getOrDefault(to, 0) + 1); } }
StringBuilder sb = new StringBuilder();
Queue<Character> zeroInDegreeNodeQueue = new LinkedList<>(); for (Map.Entry<Character, Integer> entry : inDegreeMap.entrySet()) { char node = entry.getKey(); int inDegree = entry.getValue(); if (inDegree == 0) { zeroInDegreeNodeQueue.offer(node); } }
while (!zeroInDegreeNodeQueue.isEmpty()) { char node = zeroInDegreeNodeQueue.poll(); sb.append(node);
Set<Character> toSet = nodeToNodeSetMap.get(node); if (toSet != null) { for (char to : toSet) { int inDegree = inDegreeMap.get(to); inDegreeMap.put(to, --inDegree); if (inDegree == 0) { zeroInDegreeNodeQueue.offer(to); } } } }
return sb.length() < nodeToNodeSetMap.size() ? "" : sb.toString(); } }
|