There is a new alien language which uses the latin alphabet. However, the order among letters are unknown to you. You receive a list of non-empty words from the dictionary, where words are sorted lexicographically by the rules of this new language. Derive the order of letters in this language.
Example 1:
Input:
[
"wrt",
"wrf",
"er",
"ett",
"rftt"
]
Output: "wertf"
Example 2:
Input:
[
"z",
"x"
]
Output: "zx"
Example 3:
Input: [ "z", "x", "z" ] Output:""
Explanation: The order is invalid, so return""
.
Note:
- You may assume all letters are in lowercase.
- You may assume that if a is a prefix of b, then a must appear before b in the given dictionary.
- If the order is invalid, return an empty string.
- There may be multiple valid order of letters, return any one of them is fine.
class Solution { public String alienOrder(String[] words) { StringBuilder sb = new StringBuilder(); int[] indegree = new int[26]; int count = 0; Map<Character, Set<Character>> map = new HashMap<>(); for (String word: words) { for (char c : word.toCharArray()) { if (indegree[c - 'a'] == 0) { indegree[c - 'a'] += 1; count += 1; } } } // construct graph for (int i = 0; i < words.length - 1; i++) { String cur = words[i]; String next = words[i + 1]; int min = Math.min(cur.length(), next.length()); for (int j = 0; j < min; j++) { if (cur.charAt(j) != next.charAt(j)) { if (!map.containsKey(cur.charAt(j))) { map.put(cur.charAt(j), new HashSet<>()); } if (map.get(cur.charAt(j)).add(next.charAt(j))) { indegree[next.charAt(j) - 'a'] += 1; } break; } } } // initial point Queue<Character> queue = new LinkedList<>(); for (int i = 0; i < 26; i++) { if (indegree[i] == 1) { queue.offer((char)('a' + i)); } } while (!queue.isEmpty()) { Character cur = queue.poll(); sb.append(cur); if (!map.containsKey(cur)) { continue; } for (char ch : map.get(cur)) { if (--indegree[ch - 'a'] == 1) { queue.offer(ch); } } } if (sb.length() != count) { return ""; } return sb.toString(); } }