拓扑排序——外星文字典114

外星人字典

题目:外星文字典

    给定一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按这门新语言的字母顺序进行了排序 。

示例 1:

输入:words = ["wrt","wrf","er","ett","rftt"]
输出:"wertf"

示例2:

输入:words=["ac","ab","zc","zb"]
输出:acbz

 

思路: 

    1. 根据词典,排序: 如["wrf", "wrf"]中,r的词典排序小于f。

    2. 如果字符在词典中没有顺序,则按照正常字母排序:如["ac","ed"], c和d没有顺序,则按正常顺序排序,即c<d

    3.如果字符串1和字符串2的最小公共字符串都相同,若前字符串的长度大于后字符串的长度,则不符合要求:如["abc","ab"]显然不符合排序规则,返回'''';

 

题解

    求按词典规则的拓扑排序

class Solution {
        public String alienOrder(String[] words) {
            Queue<Character> queue = new PriorityQueue<>();
            Map<Character, List<Character>> map = new HashMap<>();
            int book[]=new int[26];
            Arrays.fill(book, -1);

            //所有节点入度设为0
            for (int i = 0; i < words.length; i++) {
                String str = words[i];
                for (int j = 0; j < str.length(); j++) {
                    book[str.charAt(j)-'a']=0;
                }
            }

            //根据词典生成拓扑图
            for (int i = 0; i < words.length - 1; i++) {
                int index = 0;
                while (index < words[i].length() && index < words[i + 1].length()) {
                    if (words[i].charAt(index) != words[i + 1].charAt(index)) {
                        map.putIfAbsent(words[i].charAt(index), new ArrayList<>());
                        if(!map.get(words[i].charAt(index)).contains(words[i+1].charAt(index)))
                        {
                            map.get(words[i].charAt(index)).add(words[i + 1].charAt(index));
                            book[words[i+1].charAt(index)-'a']++;
                        }
                        break;
                    }
                    index++;
                }
                if (index == Math.min(words[i].length(), words[i + 1].length())) {
                    if (words[i].length() > words[i + 1].length()) {
                        return "";
                    }
                }
            }

            //节点为0,则入队列
            int sum=0;
            for(int i=0;i< book.length;i++)
            {
                if(book[i]==0) queue.add((char) (i+'a'));
                if(book[i]!=0) sum++;
            }

            //计算拓扑排序
            int index=0;
            char res[]=new char[sum];
            while (!queue.isEmpty())
            {
                char temp=queue.poll();
                res[index++]=temp;
                if(map.get(temp)!=null)
                {
                    for(char nigb: map.get(temp))
                    {
                        book[nigb-'a']--;
                        if(book[nigb-'a']==0) queue.add(nigb);
                    }
                }
            }

            return index==sum?new String(res):"";
        }
    }

 

算法小白,欢迎指教。

posted @ 2021-12-22 14:35  言思宁  阅读(87)  评论(0编辑  收藏  举报