Google、Airbnb、Facebook面试题 | 外星人的字典(Alien Dictionary)

1,695 阅读3分钟

2017-09-24

专栏 | 九章算法
网址 | www.jiuzhang.com

题目描述

外星人有自己的语言。虽然他们使用的字母表和英文相同,但是字母的顺序不同。现在你获得了一部外星人的字典,字典中单词的顺序按照外星人的字母表顺序排列。你通过字典分析出外星人的字母顺序吗?

Example:

[
"wrt",
"wrf",
"er",
"ett",
"rftt"
]
正确顺序是”wertf”。

注释:
1.所有字母均为小写字母
2.如果没有合法的顺序序列,输出空串
3.如果有多个合法的顺序序列,输出任意一个即可

解题思路

本题其实是字典序排序的逆过程:通过排好序的序列推得字母的字典序。从样例分析,”wrt”小于”wrf”当且仅当t的字典序小于f。也就是说,words[i]小于words[i+1]当且仅当这两个words第一个不同的字母(设为p和q)p的字典序小于q(或者words[i]是words[i+1]的前缀)。而且我们发现,因为大小关系是有传递性的,所以只需比较相邻的words就可以了。

经过上述分析和处理,我们可以得到若干对字母间的大小关系,期望得到一个完整的字母顺序序列。

本题中有一个小技巧,字母抽象为图中的点,字母间的大小关系(u<v)抽象成图中的边(u,v)。然后我们要解决的问题原本是一个找好符合条件的字母排序顺序,现在可以转换为找有向图是否有拓扑排序。 拓扑排序( Topological Sort)是解决这类问题最方面、快捷的算法。

那么拓扑排序是什么呢?拓扑排序是把一个有向图的顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前(若图中有环则无法得到完整的序列)。

拓扑排序可以在O(m)时间内用宽度优先搜索实现,m为边数。具体做法为:计算每个顶点的入度,将入度为0的点加入队列,并把该点从图中删去(同时减少从该点出发到其他点的入度),若因此导致其他点入度为0,将那些入度变为0的点也加入队列;直到队列无法加入更多点。此时,若全部点都在队列中,拓扑排序成功,该队列顺序即为字母顺序。否则没有合法的字母顺序序列,输出空串。算法整体时间复杂度为O(n*length),n为单词个数,length为单词平均长度。

参考代码

登陆九章算法官网:www.jiuzhang.com获取更多面试题及答案。

Alien Dictionary参考代码

面试官角度分析

本题的难点是在首先怎么想到要把题目转化为一堆字母的大小关系,然后第二步难点是怎么把字母的大小关系转换为有向图,第三步考察难点是怎么想到把有向图的问题用拓扑排序解决。 如果能够做出来,最后可以达到hire。

LintCode相关练习

Topological Sorting


推荐阅读



欢迎关注我的微信公众号:九章算法(ninechapter)。
精英程序员交流社区,定期发布面试题、面试技巧、求职信息等

九章算法,IT教育领域的深耕者
九章算法,IT教育领域的深耕者