Alien Dictionary

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

Input:
[
  "wrt",
  "wrf",
  "er",
  "ett",
  "rftt"
]

Output: "wertf"

题意 题目定义了一个新的字母先后顺序。给出了几个sample,问是否能推断出所有字母的先后顺序。如果字母推断有相互矛盾的地方,就返回空串。 这是一个典型的 建图 + 拓扑排序。

代码

class Solution {
    public String alienOrder(String[] words) {
        List<char[]> relations = new ArrayList<>();
        int[] degree = new int[26];
        Arrays.fill(degree, -1);
        for(String s : words) {
            for(char c : s.toCharArray()) {
                degree[c -'a'] = 0;
            }
        }
        for(int i = 0; i < words.length - 1; i++) {
            int j = i+1, len = Math.min(words[i].length(), words[j].length());
            int k = 0;
            for( k = 0; k < len; k++) {
                if(words[i].charAt(k) != words[j].charAt(k)) {
                    relations.add(new char[]{words[i].charAt(k), words[j].charAt(k)});
                    degree[words[j].charAt(k) - 'a']++;
                    break;
                }
            }
            if(k == len && words[i].length() > words[j].length()) return "";
        }
        //bfs part
        Queue<Integer> queue = new LinkedList<>();
        for(int i = 0; i < degree.length; i++) {
            if(degree[i] == 0) {
                queue.add(i);
                degree[i] = -1;
            }
        }
        String ret = "";
        while(!queue.isEmpty()) {
            int cur = queue.poll();
            ret += (char)(cur + 'a')+ "";
            for(int i = 0; i < relations.size(); i++) {
                if(relations.get(i)[0] == (cur + 'a')) degree[relations.get(i)[1] - 'a']--;
            }
            for(int i = 0; i < degree.length; i++) {
                if(degree[i] == 0) {
                    queue.add(i);
                    degree[i] = -1;
                }
            }
        }
        for(int i = 0; i < degree.length; i++) {
            if(degree[i] != -1) return "";
        }
        return ret;
    }
}

Search

    Table of Contents