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获取更多面试题及答案。
面试官角度分析
本题的难点是在首先怎么想到要把题目转化为一堆字母的大小关系,然后第二步难点是怎么把字母的大小关系转换为有向图,第三步考察难点是怎么想到把有向图的问题用拓扑排序解决。 如果能够做出来,最后可以达到hire。
LintCode相关练习
推荐阅读
- 12 个 tips 教你搞定 onsite!
- 25 个 questions, 教你向面试官提问!
- 10 个 tips 教你搞定电面!
- 北美IT企业fulltime薪资大曝光
- IT 简历模板大放送 | 《如何写好技术简历》讲座精华总结
- 面试遇到做过的题怎么办?
- 冷冻期大揭秘 | Google、FB、Amazon、Linkedin冷冻期
- 面试前如何了解一家IT企业?试试官方技术博客!
- Google晋升机制 | 大公司如何升级打怪, 获得晋升?
欢迎关注我的微信公众号:九章算法(ninechapter)。
精英程序员交流社区,定期发布面试题、面试技巧、求职信息等
