269. Alien Dictionary

Leetcode: 269. 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 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:
  1. You may assume all letters are in lowercase.
  2. You may assume that if a is a prefix of b, then a must appear before b in the given dictionary.
  3. If the order is invalid, return an empty string.
  4. There may be multiple valid order of letters, return any one of them is fine.
Hint:
  1. need to check the lexicographical order, like ["wrtkj", "wrt"], and ["wrt", "wrtkj"]
Solution:

Main class

class Solution {
    public String alienOrder(String[] words) {
        if(words == null)
            return "";
        //for storing list of connected characters to each character
        Map<Character, Set<Character>> graph = new HashMap<Character, Set<Character>>();
        //for storing indegree count to each character
        Map<Character, Integer> indegree = new HashMap<Character, Integer>();
        //result
        StringBuilder result = new StringBuilder();
        //initialization
        initialize(words, graph, indegree);
        //build graph and set count for each indegree
        buildGraphAndGetIndegree(result, words, graph, indegree);
        //using breadth-first Search to do topological sorting
        topologicalSort(result, graph, indegree);
        //return result
        return result.toString();
    }
  
    private void initialize(String[] words, Map<Character, Set<Character>> graph, Map<Character, Integer> indegree){
        for(String word:words){
            for(int i = 0; i < word.length(); i++){
                char curr = word.charAt(i);
                //initialize graph for each character with new Set
                if(graph.get(curr) == null){
                    graph.put(curr, new HashSet<Character>());
                }
                //initialize indegree for each character with count 0
                if(indegree.get(curr) == null){
                    indegree.put(curr, 0);
                }
            }
        }
    }

    private void buildGraphAndGetIndegree(StringBuilder result, String[] words, Map<Character, Set<Character>> graph, Map<Character, Integer> indegree){
        for(int i = 0; i < words.length-1; i++){
            //need compare two adjacent words
            String curr = words[i];
            String next = words[i+1];
            int len = Math.min(curr.length(), next.length());
            //
            boolean breakPoint = false;
            
            for(int j = 0; j < len; j++){
                //need compare two characters which are same position in curr and next
                char from = curr.charAt(j);
                char to = next.charAt(j);
                if(from != to){
                    if(!graph.get(from).contains(to)){
                        graph.get(from).add(to);
                        indegree.put(to, indegree.get(to)+1);
                    }                 
                    breakPoint = true;
                    break;
                }
            }
            if(!breakPoint && curr.charAt(len-1) == next.charAt(len - 1) && len < curr.length()){
                result.setLength(0);
            }
        }
    }

    private void topologicalSort(StringBuilder result, Map<Character, Set<Character>> graph, Map<Character, Integer> indegree){
        Queue<Character> queue = new LinkedList<Character>();
        //traverse indegree, extract characters which count is 0, which is roots
        for(Character key : indegree.keySet()){
            if(indegree.get(key) == 0)
                queue.add(key);
        }
        //BFS search
        while(!queue.isEmpty()){
            //poll out the top element from queue
            char currRoot = queue.poll();
            result.append(currRoot);
            //find the connected characters, pick the indegree of character is 1, and add those to queue
            Set<Character> connectedCharacters = graph.get(currRoot);
            if(connectedCharacters != null){
                for(char character : connectedCharacters){
                    Integer count = indegree.get(character);
                    if(count == 1)
                        queue.add(character);
                    indegree.put(character, count-1); // each time when you traversed at the character, the indegree will reduce 1 for removing the connection from parent point
                }
            }
        }
        //check cycle existing
        if(result.length() != indegree.size())
            result.setLength(0);
    }    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,289评论 0 10
  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,380评论 0 23
  • 到了十二月份的中旬,这一年就只剩下一个小尾巴了,常常会觉得时间过得太快,还没有来得及做什么就已经到了年末岁...
    乖乖的小竹子阅读 3,719评论 0 4
  • 管他呢,做就是了。 文/张知道 我们经常都有很多顾虑,在做某件事之前总是怕这个怕那个,迟迟下不了决心,往往还没有想...
    张知道阅读 431评论 1 1
  • 首先,要做AngularJS国际化,需要下面三个模块 大家可以使用bower工具下载这些模块 首先,我们这里那中文...
    忧郁的小码仔阅读 2,110评论 0 0