当前位置:网站首页 > 技术博客 > 正文

字典树 leetcode



大家好,又见面了,我是你们的朋友全栈君。

字典树】(Trie Tree) 是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串)。 它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。                                                     ——百度 · 百科

还好,它还有其他的名字,更能表述出它的实质:

接下来将对经典的字典树进行代码实现;接着做几个变体题目深入理解字典树的强大;最后回到日常生活,瞧瞧字典树怎样融入到了我们的生活之中 >_<

首先,数据结构嘛,肯定是要先构建节点(Node);

弄清了节点的结构和含义,一棵树(Tree)的构建就会水到渠成

这里有两个关键点:

构建好了节点,下面开始构建树,并写出树的一些方法 ↓

变式1:利用字典树的构造过程——忽略后缀单词

【Leetcode_820】单词的压缩 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。 例如,如果这个列表是 [“time”, “me”, “bell”],我们就可以将其表示为 S = “time#bell#” 和 indexes = [0, 2, 5]。# 表示一个结束位置 那么成功对给定单词列表进行编码的最小字符串长度是多少呢? 示例:    输入: words = [“time”, “me”, “bell”]    输出: 10    说明: 字符串S = “time#bell#” , 提示: 1 <= words.length <= 2000 1 <= words[i].length <= 7 每个单词都是小写字母 。

变式2:利用字典树充分利用前缀(后缀)性质,优化暴力算法

【Leetcode_面试题_17_13】恢复空格 哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子”I reset the computer. It still didn’t boot!“已经变成了”iresetthecomputeritstilldidntboot”。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。 注意:本题相对原题稍作改动,只需返回未识别的字符数 示例: 输入: dictionary = [“looked”,“just”,“like”,“her”,“brother”]  sentence = “jesslookedjustliketimherbrother” 输出: 7 解释: 断句后为”jess looked just like tim her brother”,共7个未识别字符。 提示:只包含26个小写字母

变式3:search方法的变异——match递归

Q:我知道match递归写法很妙,但有什么用呢?cur一条路走到黑的思路不是更好理解吗?

A:恰恰是因为“cur一条路走到黑”的思路有弊端——有时我们需要走一个分叉的路去尝试更多的可能

通过下面的两道变式题目,就能理解递归型search的强大之处

变式4:含有通配符的字典树匹配——递归的search

【Leetcode_211】添加与搜索单词-数据结构设计 设计一个支持以下两种操作的数据结构: void addWord(word)   添加单词 bool search(word)   可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 ‘.’ 可以表示任何一个字母

变式5:允许且必须变化一个字符后再匹配——递归的search

【Leetcode_676】实现一个魔法字典 实现一个带有buildDict, 以及 search方法的魔法字典。 对于buildDict方法,你将被给定一串不重复的单词来构建一个字典。 对于search方法,你将被给定一个单词,并且判定能否只将这个单词中一个字母换成另一个字母,使得所形成的新单词存在于你构建的字典中。

字典树(前缀树后缀树,单词查找树)其实早已融入了我们生活的点滴之中

自动补全(输入法也是哦)

拼写检查与修复

IP 路由 (最长前缀匹配)

敏感词检测 面试/考试的时候很喜欢问一些关于搜索引擎的问题。这是一个经典问题,搜索引擎如何判断你搜索的内容是敏感词

哦,我知道!是建立一个敏感词组成的Hash集合,将搜索内容利用分词库进行分词,分出的词去进行Hash匹配。 你获得了30分。

Hash的方法并不准确——“我爱日本”,分词出“我”,“爱”,“日本”,每个切片都毫无问题,组合在一起呢?

Hash的方法代价太高——为了解决上面的问题,只能把“我爱日本”作为一个整体加入哈希集合中。但是,你又需要把”我爱Japan”,“我爱JAPAN”,“我love日本”,”我love Japan”这样各种组合加入哈希集合,开销不可想象。 因此,海量敏感词的存储方式必然不是Hash,而是一个多叉的树形结构(比如Trie树)

☑ 部分题目来源 :

结束了,不知道你意识到没有,Trie树的检索机制,和你的《英语词典》完全一致。 这是我想说的最后一个问题的答案——”字典树”名称的由来。

♬ END ♪ By a Lolicon ♥

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/196340.html原文链接:https://javaforall.cn

  • 上一篇: sar 命令
  • 下一篇: 给软件分组名称大全
  • 版权声明


    相关文章:

  • sar 命令2024-12-23 20:01:01
  • java爬虫需要的基本知识2024-12-23 20:01:01
  • js中怎么取数组里面的数据2024-12-23 20:01:01
  • 原生js实现promise.all2024-12-23 20:01:01
  • speex压缩率2024-12-23 20:01:01
  • 给软件分组名称大全2024-12-23 20:01:01
  • cpu测试方法2024-12-23 20:01:01
  • 进程和线程的区别和作用2024-12-23 20:01:01
  • es6新语法有哪些2024-12-23 20:01:01
  • neo4j community和desktop2024-12-23 20:01:01