一个单词单词字母交换,可得另一个单词,如army->mary,成为兄弟单词。提供一个单词,在字典中找到它的兄弟。描述数据结构和查询过程
2012-10-15 17:52
656 查看
这个解法主要引子一篇博客的解答,我只是实现,方法引于: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)。
使用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)。
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_SIZE 287 typedef struct hash_node { char *word; struct hash_node *next; }hash_node,*hash_map; hash_map bin[MAX_SIZE]={NULL}; unsigned int get_index(char *pWord)//get hash index { int len=strlen(pWord); int i; unsigned int index=1; for(i=0;i<len;i++) index=index*(pWord[i]-'A'+1);//这里如果是大写字母的话就会使负值,所以要根据情况而定 return index%MAX_SIZE; } void insert_word(char *pWord) //insert word,if collision happens,use link list { unsigned int index=get_index(pWord); printf("%d\n",index); hash_node *p; for(p=bin[index];p!=NULL;p=p->next) if(strcmp(p->word,pWord)==0) return; p=(hash_node*)malloc(sizeof(hash_node)); p->word=(char*)malloc(strlen(pWord)+1); strcpy(p->word,pWord); p->word[strlen(pWord)]='\0'; p->next=bin[index];// 不断的插入到表头就好,this will be efficient bin[index]=p; } void search_brother(char *pWord) //search brother words { unsigned int index=get_index(pWord); hash_node *p; for(p=bin[index];p!=NULL;p=p->next) if(strcmp(pWord,p->word)!=0) printf("%s\t",p->word); } void main() { char *string[]={"mary","army","ramy"}; int len=sizeof(string)/sizeof(char*); int i; for(i=0;i<len;i++) insert_word(string[i]); char word[]="mary"; search_brother(word); }
相关文章推荐
- 数据结构与算法——提供一个单词,在字典中找到它的兄弟
- [转]给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词
- 给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词。
- finding anagrams(颠倒字母而成的字) of a given word; 编程珠玑之如何找出一个单词的换位词; 如何找出字典中的兄弟单词
- SQL Server 查询数据库的表结构以及描述来生成数据字典
- 字典中查找兄弟词,如 army 与 mary为兄弟单词(2012.5.6百度实习生笔试)
- IFC标准是为了满足建筑行业的信息交互与共享而产生的统一数据标准,是建 筑行业事实上的数据交换与共享标准。本文概要介绍了IFC标准的产生及发展 历程,IFC的整体框架结构,简要说明了IFC标准的实现方法和过程,描述了 当前的应用以及我们应该更加积极地利用IFC标准为建筑软件行业服务。
- 程序员面试金典——解题总结: 9.18高难度题 18.10给定两个字典里的单词,长度相等。编写一个方法,将一个单词变换成另一个单词,一次只改动一个字母。
- finding anagrams(颠倒字母而成的字) of a given word; 编程珠玑之如何找出一个单词的换位词; 如何找出字典中的兄弟单词
- SQL 查询业务库_SQL 查询数据字典_sql查询表结构,过程,视图,主键,外键,约束
- SQL 查询业务库_SQL 查询数据字典_sql查询表结构,过程,视图,主键,外键,约束
- 给定两个有着相同长度且都在字典内的单词,要求写一个方法来把一个单词变型成另一个单词。 一次只能转换一个字母,且每次生成的单词必须在字典内
- 给出一个2D板和字典中的单词列表,找到棋盘上的所有单词。每个单词必须由顺序相邻单元格的字母构成。不能重复使用
- 数据结构5 用一个栈实现另一个栈的排序
- 关于数据库查询一个表中的数据插入到另一个表中
- 一个提供数据存储和查询服务的分布式中间件需要考虑的一般问题
- 快速实现将一个表中数据更新至另一个库中的同结构表
- 把SQL SERVER里表里的数据导出成为insert into 脚本,终于找到这个过程了
- 微信小程序编译过程中如何将一个页面的数据传到另一个页面呢
- sqlserver 两个数据库中表的结构不同,如何把一个表中的数据导入到另一个表中