兄弟单词问题 --百度实习笔试题(2012.5.6)

来源:互联网 发布:初高中教学网络直播 编辑:程序博客网 时间:2024/05/21 11:37

题意:

       一个单词,单词字母交换,可得另一个单词,如army->mary,成为兄弟单词。提供一个单词,在字典中找到它的兄弟。描述数据结构和查询过程。

解法1:

 常规思路

       在字典中找到某一个单词的兄弟,根据题意,它俩必须含有相同的字母组成,即单词里面的字母以及字母个数必须相同。

       因为他说的是在字典中查找,所以我们默认字典里面的所有单词都不相同,那么对于字典的数据结构,我们可以使用Trie树,对于Trie树,我摘了一段百度百科上的说明:

       字典树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

    也就是说, 字典树是专为字符串的查询等操作而生的。回到本题,我们将字典组织成字典树以后,对于某个单词的查询,就要把他的所有兄弟单词的情况列举出来,然后一一和字典树去匹配。经过树的处理,查找的时间就会大大降低。

解法2:

上面那种方法我感觉不好的地方在于先要列举所有兄弟单词的情况,如果一个单词由n个字符组成,则它的兄弟单词的数量将达到  n! 个,而且不好表示,所以可以换个思路。可以把每个单词的字母分离出来,不同的字母可以用不同的素数表示,如从A-Z用{2,3,5,7.......}代表,.然后将代表每个字母的素数乘起来得到的积就可以代表这个独一无二的单词,然后用待查找的单词的素数积和字典里每个单词的素数积比较,相同的话,则可认为他们是兄弟单词。

这样的话,字典里的每一个单词就都可以用一个素数来表示,简化了单词的存储和查询。

0 0
原创粉丝点击