给出字典列表,给出字典

Ock*_*zor 3 java algorithm

我在接受采访时被问到这个问题.假设您有一个有序字典,并给出一个无序字符列表 - 您将如何按优先顺序排列这些字符?此词典包含保证显示所有26个字符的单词.但请注意,字典的大小可能是任何内容.字典可以小到几个单词,并且可能没有针对每个字符的单独部分,例如,可能没有用于开头的单词的部分a; 虽然a会作为另一个词的一部分出现,例如"bat".

这本字典可能被"责令"(/讽刺)这样"斑马",'苹果’,'猫’,'粗鲁’,如果你给出的列表{ a,z,r},正确的顺序是{ z,a,r因为"斑马"在字典中位于"苹果"之前,我们知道在presedence z之前a出现.因为"apple"出现在"cat"之前,我们知道a之前c.因为"cat"出现在"crass"之前,我们知道这a到来之前r,这种排序的叶子cr用ambugious presendece,但由于信件列表为{ a,z,r},我们知道解决的办法是{ z,a,r}.

Hel*_*rld 11

使用带有26个顶点的有向图,每个顶点代表一个字符.从顶点A到顶点B的边缘表示字母B在A的前面.

第一步是建立只有顶点但没有边缘的图形.

其次,逐字扫描输入字典.并将每个单词与前一个单词进行比较.您应该为扫描的每个单词找到确切的关系.因此,您在此图表中添加了一条边.假设字典是正确的,应该没有冲突.

完成字典后,输出字母

  1. 选择一个随机顶点,遍历它的路径,直到找到一个指向任何东西的字符.这是字母表中的第一个字符.输出并从图表中删除它.
  2. 继续做1直到删除所有顶点.

编辑:为了更好地解释这个算法,让我们在你的样本输入上运行它.

输入:{"zebra","apple","cat","crass"}

字0和字1,我们立即知道z在a之前出现,所以我们创建一个边a-> z

单词1和单词2,我们立即知道a在c之前出现,所以我们制作另一个边c-> a

Word 2和Word 3,第一个字母是相同的"c",但第二个字母不同,所以我们知道a出现在r之前,所以我们有另一个边r-> a

现在所有的单词都被读了.通过随机拾取一个顶点来输出顺序(比如我们选择c),然后我们在图中有c-> a-> z.输出z并从图形中删除z(将其标记为NULL).现在选择另一个(比如我们选择r),然后我们在图中找到r-> a.我们输出并删除图表.现在我们选择另一个(比如我们再次选择c),找不到路径,所以我们只输出c并删除它.现在我们选择最后一个,r,再没有路径,所以我们输出r并删除它.由于删除了所有顶点,因此算法完成.

输出为z,a,c,r."c"和"r"的顺序是随机的,因为我们并不真正知道它们与输入的关系.

  • @kasavbere我的算法在O(N)时间内解决问题,N是字典的大小和O(k ^ 2)空间,k是字母表的大小.我怀疑是否有更有效的方法来做到这一点.因此,我不明白你的意思是过度杀戮或"继续做更多的伤害".最后两点是必要的,因为没有更好的方法来保证字母表中的"最后"字符.你能详细说明一下你的问题吗?(比如,算法的哪个部分效率不高) (3认同)
  • @kasavbere您提供的示例字典不是有效字典 (2认同)