1 public class Solution {
 2     public String alienOrder(String[] words) {
 3         if (words.length == 0) {
 4             return "";
 5         }
 6         StringBuilder result = new StringBuilder();
 7         Map<Character, Integer> degrees = new HashMap<>();
 8         Map<Character, Set<Character>> letters = new HashMap<>();
 9         
10         for (String word : words) {
11             for (char c : word.toCharArray()) {
12                 degrees.put(c, 0);
13             }
14         }
15         
16         for (int i = 0; i < words.length - 1; i++) {
17             for (int j = 0; j < Math.min(words[i].length(), words[i+1].length()); j++) {
18                 char c1 = words[i].charAt(j);
19                 char c2 = words[i+1].charAt(j);
20                 
21                 if (c1 != c2) {
22                     if (!letters.containsKey(c1)) {
23                         letters.put(c1, new HashSet<>());
24                     }
25                     Set<Character> set = letters.get(c1);
26                     if (!set.contains(c2)) {
27                         set.add(c2);
28                         letters.put(c1, set);
29                         degrees.put(c2, degrees.get(c2) + 1);
30                     }
31                     break;
32                 }
33             }
34         }
35         
36         Queue<Character> queue = new LinkedList<>();
37         for (char c : degrees.keySet()) {
38             if (degrees.get(c) == 0) {
39                 queue.offer(c);
40             }
41         }
42         
43         while (!queue.isEmpty()) {
44             char c = queue.poll();
45             result.append(c);
46             if (letters.containsKey(c)) {
47                 for (char cSub : letters.get(c)) {
48                     degrees.put(cSub, degrees.get(cSub) - 1);
49                     if (degrees.get(cSub) == 0) {
50                         queue.offer(cSub);
51                     }
52                 }
53             }
54         }
55         
56         return result.length() == degrees.size() ? result.toString() : "";
57     }
58 }

 

posted on 2016-08-07 13:44  keepshuatishuati  阅读(152)  评论(0编辑  收藏  举报