数据结构与算法——提供一个单词,在字典中找到它的兄弟
来源:互联网 发布:淘宝买家信誉查询工具 编辑:程序博客网 时间:2024/04/30 15:42
题目:
一个单词单词字母交换,可得另一个单词,如 army->mary,成为兄弟单词。提供一个单词,在字典中找到它的兄弟。描述数据结构和查询过程。(百度2012年实习生面试题)
解题思路:
http://superonion.iteye.com/blog/1522199
思路一:使用trie树
在字典树的前缀中再存储一个vector结构的容器:Cpp代码
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)。
要掌握的知识:
字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。
典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。
它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
参考链接:
http://baike.baidu.com/link?url=fFhIr3z5eY9Qor37DOB8IwlMJZ65PVoyq29k7WY5bvI7g3dIyma2q7n0SuzRA2VK_-67p869_r7cUYKjMXCCYa
http://blog.csdn.net/hguisu/article/details/8131559
相关题目:
如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串)。思路:判断各自素数乘积是否相等。更多方法请参考http://blog.csdn.net/v_JULY_v/article/details/6347454
0 0
- 数据结构与算法——提供一个单词,在字典中找到它的兄弟
- 一个单词单词字母交换,可得另一个单词,如army->mary,成为兄弟单词。提供一个单词,在字典中找到它的兄弟。描述数据结构和查询过程
- 用户输入一个单词,要求在一个字典中找出该单词的所有兄弟单词,并输出
- 用户输入一个单词,要求在一个字典中找出该单词的所有兄弟单词,并输出
- 在字典中查找兄弟单词
- 找到提供的句子中最长的单词,并计算它的长度。
- javascript找到提供的句子中最长的单词,并计算它的长度
- 数据结构——算法之(007)(在一个字符串中找到第一个只出现一次的字符)
- 算法与数据结构面试题(21)-在一个字符串中找到第一个只出现一次的字符
- 百度面试题--给定一个单词,从字典查找该单词的所有兄弟单词
- 单词字典中对兄弟单词查找算法(C++实现)
- 兄弟单词 — 两种算法实现
- 兄弟单词 — 两种算法实现
- 数据结构与算法——用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回
- 给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词。
- 给定一个字符串s和一个单词dict的字典,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。
- 【算法与数据结构】将字符串中最长的单词输出
- 字典中查找兄弟词,如 army 与 mary为兄弟单词(2012.5.6百度实习生笔试)
- Harris角点检测: Harris Corner Detector
- Linux下把项目部署到tomcat
- postgre- 常用基本sql 语句
- 霍夫变换基础知识-- The Hough Transform: Basics
- Android自定义九宫格图案解锁
- 数据结构与算法——提供一个单词,在字典中找到它的兄弟
- OC中数组的基本操作
- Android 源码编译遇到的几个错误
- 霍夫变换的标准形式--The Hough Transform: Normal form
- 什么是PHP
- Java 异常处理
- 注解
- {Unity} Shader初步
- Canny边缘检测器-- The Canny Edge Detector