剑指 Offer II 114. 外星文字典

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) {
// 处理测试用例:["z", "z"], 此时题目预期结果为 "z"
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()) {
// 处理测试用例:["abc","ab"]
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();
}
}

References

剑指 Offer II 114. 外星文字典