题目如下(002)

来源:互联网 发布:淘宝开店细则 编辑:程序博客网 时间:2024/06/14 10:28

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

方法引于:http://blog.csdn.net/yahohi/article/details/7985328。

解法一:

使用hash_map和链表。 
首先定义一个key,使得兄弟单词有相同的key,不是兄弟的单词有不同的key。例如,将单词按字母从小到大重新排序后作为其key,比如bad的key为abd,good的key为dgoo。 
使用链表将所有兄弟单词串在一起,hash_map的key为单词的key,value为链表的起始地址。 
开始时,先遍历字典,将每个单词都按照key加入到对应的链表当中。当需要找兄弟单词时,只需求取这个单词的key,然后到hash_map中找到对应的链表即可。 
这样创建hash_map时时间复杂度为O(n),查找兄弟单词时时间复杂度是O(1)。

 

解法二:

同样使用hash_map和链表。

将每一个字母对应一个质数,然后让对应的质数相乘,将得到的值进行hash,这样兄弟单词的值就是一样的了,并且不同单词的质数相乘积肯定不同。

使用链表将所有兄弟单词串在一起,hash_map的key为单词的质数相乘积,value为链表的起始地址。

对于用户输入的单词进行计算,然后查找hash,将链表遍历输出就得到所有兄弟单词。

这样创建hash_map时时间复杂度为O(n),查找兄弟单词时时间复杂度是O(1)。


这里的n显而易见是指字典中的单词数目。由此可见,hash(散列表)可以有效的解决效率问题。

0 0