如何找出字典中的兄弟单词
来源:互联网 发布:九九乘法表算法 编辑:程序博客网 时间:2024/06/05 09:25
1. 给定一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词,例如单词army和mary互为兄弟单词。现在给定一个字典,用户输入一个单词,如何根据字典找出这个单词有哪些兄弟单词?要求时间和空间效率尽可能的高。【2012年百度实习生招聘笔试题】
思路一:使用trie树。
在字典树的前缀中再存储一个vector结构的容器:
- struct word
- {
- vector<string> brother; // 用于保存每个单词的兄弟单词
- word *next[26]; // 字典树中每个节点代表一个字符,并指向下一个字符
- };
如上述数据结构所示,字典树的建立是在预处理阶段完成的,首先根据字典中的单词来建立字典树,建立的时候,需要稍微特殊处理一下,就是比如pots、stop和tops互为兄弟单词,那么在字典中按照首字母顺序的话,应该先遇到pots单词,那么我首先对其进行排序,结果是opts,那么字典树中就分别建立4个节点,分别为o->p->t->s,当然这个是不同层次的,在节点s处的vector容器brother中添加单词pots,遇到stop的时候,同样的方法,排序是opts,此时发现这4个节点已经建立了,那么只需要在第四个节点s处的vector容器brother中添加单词stop,tops单词的处理方法是同样的。
这样建立完字典树后,查询兄弟单词的效率就会很高了,比哈希的效率还要高;查到tops的兄弟的单词的时候,首先排序,那么就是opts,然后在字典树中查找opts,在s处将其vector容器brother中的的单词输出就是tops的所有兄弟单词。
思路二:使用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)。
- 如何找出字典中的兄弟单词...
- 如何找出字典中的兄弟单词
- 如何找出字典中的兄弟单词
- 如何找出字典中的兄弟单词
- 如何找出字典中的兄弟单词
- 如何找出字典中的兄弟单词
- 如何找出字典中的兄弟单词
- 找出字典中的兄弟单词
- 找出字典中的兄弟单词
- finding anagrams(颠倒字母而成的字) of a given word; 编程珠玑之如何找出一个单词的换位词; 如何找出字典中的兄弟单词
- finding anagrams(颠倒字母而成的字) of a given word; 编程珠玑之如何找出一个单词的换位词; 如何找出字典中的兄弟单词
- 用户输入一个单词,要求在一个字典中找出该单词的所有兄弟单词,并输出
- 用户输入一个单词,要求在一个字典中找出该单词的所有兄弟单词,并输出
- 在字典中查找兄弟单词
- 给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词。
- 给定一个字符串列表,找出单词中最长单词,可以用l列表中的其他单词一次构建一个字符。返回具有最小字典顺序的最长单词。
- 百度面试题--给定一个单词,从字典查找该单词的所有兄弟单词
- 兄弟单词
- usaco 5.4 Character Recognition(统计DP)
- 痛苦造就性格(也许还造就坏产品)(zz.IS2120)
- 通用USB设备驱动源码分析
- spinlock
- usb设备的probe全过程
- 如何找出字典中的兄弟单词
- 网页内嵌Windows Media Player播放器的多文件播放方法
- 常见的8种Java不规范代码
- 【学习笔记】编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译
- JavaScript学习笔记(十一) 函数name属性和函数的提升
- 我的SQLhelper
- Jamie Zawinski访谈:在折腾中成长 (zz.IS2120)
- c++ primer 顺序容器
- lua基础学习 - 非全局函数