寻找兄弟单词:这是我百度实习笔试的时候一道题目,面试的时候在HR的房间看到了我的试卷,发现这题我只得了两分。。。这两分还是因为我想到了用树结构,不过只是简单的26叉字典树。。。。 当时想到应该没有这么简单,可是时间紧迫阿。
题目是这样的:兄弟单词(在《编程珠玑》一书中称为换位词),就是只使用项目的字母,不同的组合构成不同的单词deposit,dopiest,posited,topside就是一组兄弟单词,设计数据结构来存储这些兄弟单词。
题目变形:手机的电话簿功能,比如我的名字金子,输入拼音时只需要按 546 94,但是不同的名字,可能有相同的数据序列表示。
出发点:让兄弟单词具有同样的标识,比如
deposit ,dopiest,posited,topside,就可以将单词中的字母排序 ,标识就为deiopst了;标识的改进,比如单词是mississippi这一单词,按照字母排序结果为iiiimppssss重复的字母很多,可以简化为i4mp2s4,m后面没有数字表示m只出现了一次。
于是可以设计成数据结构:读进来一个单词,首先将单词中的字母排序,得到一个标识,每个标识后面链接一个链表,链表里每个节点存放的是该标识中的字母可以组成的单词,值得注意的是,兄弟单词的数目一般都小于他们的标识中字母全排列的个数。
至于标识的存储,是采用字典树呢?还是每个标识作为一个节点,组成二元查找树呢?我还没想好,因为题目的难点是你要想到使用“标识”(好绕嘴阿)。至于电话簿的功能,《编程之美》上有,我记得是类似于三阶树的原理。