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"".
[暴力解法]:
时间分析:
空间分析:
[优化后]:
时间分析:
空间分析:
[奇葩输出条件]:
[奇葩corner case]:
相同的c2,只需要存一次(没有就新存 有就不存),反正如果存过 就必须退出了(返回一组即可 不用重复加)
"["za","zb","ca","cb"]" How is this test case handled.
It should give out an empty string as the order can not be decided from the words given. but instead it returns "azbc". 回答:we can only now z-> c and a-> b
so 'azbc' is right but right result is not limited to this only one.
you can test 'zcab', 'abzc' are will all right as it is topological sort
结果字符串长度不等于度数(不是不等于单词数)
["z","z"]的度数 = 字符串长度1
正常,应该返回"z"而不是""
[思维问题]:
忘了拓扑排序用BFS怎么写了
[英文数据结构或算法,为什么不用别的数据结构或算法]:
DFS写拓扑排序似乎都很麻烦
存点到点的对应关系,用map(其中的字符必须存成包装类Character,但是循环的时候可以写char)
//存每个点的入度
Map<char, Integer> degree = new HashMap<>();
//存c1到c2...的对应关系
Map<char, Set<char>> map = new HashMap<>();
[一句话思路]:
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:

[一刷]:
- 出现index[i + 1]时,需要提前备注把上线变为n - 1
[二刷]:
- BFS的时候别忘了吧把取出的c1添加到结果中去. 而且必须现有c1的key才能扩展。
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
c1 c2都要先判断一下有没有,再存
[复杂度]:Time complexity: O(n^2 单词数*字母数) Space complexity: O(n)
[算法思想:递归/分治/贪心]:
[关键模板化代码]:
BFS的存储和扩展是两个独立的步骤,扩展时必须先判断key是否存在,再做扩展
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
[代码风格] :
[是否头一次写此类driver funcion的代码] :
class Solution {
    public String alienOrder(String[] words) {
        //ini:HashMap<Char, Integer> degree, store all chars into hashmap, String res
        //存每个点的入度
        Map<Character, Integer> degree = new HashMap<>();
        //存c1到c2...的对应关系
        Map<Character, Set<Character>> map = new HashMap<>();
        String res = "";
        for (String word : words) {
            for (char c : word.toCharArray())
                degree.put(c, 0);
        }
        //compare and store, n - 1
        for (int i = 0; i < words.length - 1; i++) {
            String cur = words[i];
            String next = words[i + 1];
            int smallerLen = Math.min(cur.length(), next.length());
            for (int j = 0; j < smallerLen; j++) {
                char c1 = cur.charAt(j);
                char c2 = next.charAt(j);
                if (c1 != c2) {
                    //new set
                    Set<Character> set = new HashSet<>();
                    //contains c1
                    if (map.containsKey(c1)) set = map.get(c1);
                    //not contain c2
                    if (!set.contains(c2)) {
                        set.add(c2);
                        map.put(c1, set);
                        degree.put(c2, degree.get(c2) + 1);
                    }
                    break;
                }
            }
        }
        //bfs, get answer
        Queue<Character> q = new LinkedList<>();
        for (char c : degree.keySet()) {
            if (degree.get(c) == 0) q.offer(c);
        }
        while (!q.isEmpty()) {
            char c1 = q.remove();
            res += c1;
            if (map.containsKey(c1)) {
                for (char c2 : map.get(c1)) {
                degree.put(c2, degree.get(c2) - 1);
                if (degree.get(c2) == 0) q.offer(c2);
            }
            }
        }
        //cc at end
        if (res.length() != degree.size()) return "";
        return res;
}
}
269. Alien Dictionary火星语字典(拓扑排序)的更多相关文章
- [leetcode]269. Alien Dictionary外星字典
		There is a new alien language which uses the latin alphabet. However, the order among letters are un ... 
- [LeetCode] 269. Alien Dictionary 外文字典
		There is a new alien language which uses the latin alphabet. However, the order among letters are un ... 
- 269. Alien Dictionary 另类字典 *HARD*
		There is a new alien language which uses the latin alphabet. However, the order among letters are un ... 
- [LeetCode] 269. Alien Dictionary 另类字典
		There is a new alien language which uses the latin alphabet. However, the order among letters are un ... 
- LeetCode 269. Alien Dictionary
		原题链接在这里:https://leetcode.com/problems/alien-dictionary/ 题目: There is a new alien language which uses ... 
- 269. Alien Dictionary
		题目: There is a new alien language which uses the latin alphabet. However, the order among letters ar ... 
- LeetCode编程训练 - 拓扑排序(Topological Sort)
		拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ... 
- 算法与数据结构基础 - 拓扑排序(Topological Sort)
		拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ... 
- [USACO12DEC]第一!First!(字典树,拓扑排序)
		[USACO12DEC]第一!First! 题目描述 Bessie has been playing with strings again. She found that by changing th ... 
随机推荐
- hadoop之 distcp(分布式拷贝)
			概述 distcp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具. 它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成. 它把文件和目录的列表作为map任务的输入,每个任务会 ... 
- RK3288 摄像头左右镜像
			系统:Android 5.1 设置摄像头左右镜像 diff --git a/frameworks/av/services/camera/libcameraservice/api1/CameraClie ... 
- NETCTOSS - 中国电信运营支持系统-网络版_V-1.0
			NETCTOSS - 中国电信运营支持系统-网络版_V-1.0 NETCTOSS: C:China T:Telecom 电信 O:Operation 运营 S:Support 支持 S:System ... 
- SQLServer中求两个字符串的交集(字符串以符号分隔)
			两个字符串,以特定符号分隔(例如‘,’号),求交集 第一种情况: declare @m varchar(100),@n varchar(100)select @m=',2,3,5,7,8,9,10,' ... 
- 利用nginx_push_stream_module实现服务器消息推送
			NGiNX_HTTP_Push_Module 是一个 Nginx 的扩展模块,它实现了 HTTP Push 和Comet server的功能.HTTP Push 被经常用在网页上主动推的技术,例如一些 ... 
- 杂项: Redis
			ylbtech-杂项: Redis Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 1. 定义返回顶部 re ... 
- ECMAScript有6种继承方式(实现继承)
			本人对于ECMAScript继承机制有些见解,如果说的不对,敬请赐教~~~~ 继承是OO语言(面向对象)挺好的概念,许多OO语言都支持两种继承方式(接口只继承方法签名.实际继承则继承实际的方法),但是 ... 
- angular的继承作用域通信
			本人学了一段时间的angular,angular之间怎样通信,我就总结以下几点,如果有哪位大神认为不对,敬请赐教. 1.父子之间的作用域进行通信 html <div ng-controller= ... 
- Understanding OpenStack Authentication: Keystone PKI
			The latest stable release of OpenStack, codenamed Grizzly, revolutionizes the way user authenticatio ... 
- JAVA构造函数在超类和子类调用注意事项
			1.构造函数: 当子类继承一个父类时,构造子类时需要调用父类的构造函数,存在三种情况 (1),父类无构造函数或者一个无参数构造函数,子类若无构造函数或者有无参数构造函数,子 ... 
