[抄题]:

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<>();

[一句话思路]:

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. 出现index[i + 1]时,需要提前备注把上线变为n - 1

[二刷]:

  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火星语字典(拓扑排序)的更多相关文章

  1. [leetcode]269. Alien Dictionary外星字典

    There is a new alien language which uses the latin alphabet. However, the order among letters are un ...

  2. [LeetCode] 269. Alien Dictionary 外文字典

    There is a new alien language which uses the latin alphabet. However, the order among letters are un ...

  3. 269. Alien Dictionary 另类字典 *HARD*

    There is a new alien language which uses the latin alphabet. However, the order among letters are un ...

  4. [LeetCode] 269. Alien Dictionary 另类字典

    There is a new alien language which uses the latin alphabet. However, the order among letters are un ...

  5. LeetCode 269. Alien Dictionary

    原题链接在这里:https://leetcode.com/problems/alien-dictionary/ 题目: There is a new alien language which uses ...

  6. 269. Alien Dictionary

    题目: There is a new alien language which uses the latin alphabet. However, the order among letters ar ...

  7. LeetCode编程训练 - 拓扑排序(Topological Sort)

    拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...

  8. 算法与数据结构基础 - 拓扑排序(Topological Sort)

    拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...

  9. [USACO12DEC]第一!First!(字典树,拓扑排序)

    [USACO12DEC]第一!First! 题目描述 Bessie has been playing with strings again. She found that by changing th ...

随机推荐

  1. http请求发生了两次(options请求)

    前言 自后台restful接口流行开来,请求了两次的情况(options请求)越来越普遍.笔者也在实际的项目中遇到过这种情况,做一下整理总结. 文章书写思路: 为什么发生两次请求 http的请求方式, ...

  2. java代码----I/O流从控制台输入信息判断并抛出异常

    package com.a.b; import java.io.*; public class Yu { public static void main(String[] args) throws I ...

  3. Type-C潮流下 如何衡量一款数据线好坏?

    不少新一代手机开始支持Type-C接口,比如乐视.PPTV.努比亚Z11.小米4C和三星Note7等.和普通Micro USB相比,Type-C数据线因为正反插的关系对品质要求更高,不然随时有短路烧毁 ...

  4. python中包和模块的使用说明

    python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用. 如果想 ...

  5. Codeforces-20152016-northwestern-european-regional-contest-nwerc-A题

    一.题目 二.题意 (1)一开始理解成:它最多需要开多少台电脑.同时,我又有个疑问,既然是最多需要开多少台,那不变成了总共有几个人开几台是最大的结果.然后,WA了无数发.直到比赛结束......其实说 ...

  6. 【BZOJ】1913: [Apio2010]signaling 信号覆盖(计算几何+计数)

    题目 传送门:QWQ 分析 人类智慧题,不会做...... 详细题解1      详细题解2 总体思路是考虑四边形 讨论凹四边形凸四边形,最后加一个单调性优化省掉个$ O(n) $ 代码 代码感觉好短 ...

  7. Change R source code

    If you'd like to simply test out the effect of that change in an interactive R session, you can do s ...

  8. 深入浅出 Java Concurrency (11): 锁机制 part 6 CyclicBarrier

      如果说CountDownLatch是一次性的,那么CyclicBarrier正好可以循环使用.它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).所谓屏障 ...

  9. 04_java之基本语法02

    01switch语句解构 * A:switch语句解构 a:switch只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码. b:格式如下: swtich(表达式){ case 常量1 : 要 ...

  10. django之上传图片

    上传图片 当Django在处理文件上传的时候,文件数据被保存在request.FILES FILES中的每个键为<input type="file" name="& ...