当前位置: 首页 > wzjs >正文

隆尧企业做网站河南省住房和城乡建设信息网

隆尧企业做网站,河南省住房和城乡建设信息网,网站建设的行业客户,公司注册网站需要什么条件208. 实现 Trie (前缀树) - 力扣(LeetCode) 题目 Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动…

208. 实现 Trie (前缀树) - 力扣(LeetCode)

题目

Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。

请你实现 Trie 类:

  • Trie() 初始化前缀树对象。
  • void insert(String word) 向前缀树中插入字符串 word 。
  • boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
  • boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。

示例:

输入
["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
[[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
输出
[null, null, true, false, true, null, true]

解释
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple");   // 返回 True
trie.search("app");     // 返回 False
trie.startsWith("app"); // 返回 True
trie.insert("app");
trie.search("app");     // 返回 True

提示:

  • 1 <= word.length, prefix.length <= 2000
  • word 和 prefix 仅由小写英文字母组成
  • insertsearch 和 startsWith 调用次数 总计 不超过 3 * 104 次

思路(以下思路是经过检索学习后得出,有一部分的构造方法超出我的知识面了,所以不看的话构造不出来)

  1. 首先这个类本身并没有内置于C++中,需要自己构造。
  2. 这个树的思路比较清楚,是个26叉树,因为其子节点分别都有可能是26个字母(除非存在某个字母不是英文单词的开头,不过显然应该不存在这种情况),然后它还要具有一个功能就是判断到达该节点时是不是组成了一个单词。
  3. 有了这两个基本的点那么就需要构造前缀树的节点类:
    1. 定义一个bool类型变量作为是否是一个单词的判断,再每次插入完成后,对最后一个节点标记为单词位。
    2. 另外需要保存子节点的指针,这里我以为可以直接继续创建对象数组,但是查了一下发现C++仅支持定义自身类型的静态对象或者是对象的指针,所以其实还是对树节点的构造方式不够了解——那么就是构造一个TrieNode* children[26]即可。
    3. 以上都需声明为public类型,否则默认是private的,这样其他类就无法调用。
  4. 接下来是操作逻辑:
    1. 初始化:现在Trie类中定义一个root的TrieNode*节点作为初始节点。
    2. 插入(insert):从根节点和插入单词头开始顺序检查对应位置的单词是否在链中,若在就往下搜,若不在就对该子节点创建一个新的TrieNode对象。不断重复知道单词遍历完成,最后将当前达到的节点的isWord更新为true。
    3. 查找(search):从根节点开始出发,根据待查找单词从头到尾的顺序顺链查找是否已经创建了对应的子节点对象,若是空指针,直接返回false。若遍历完整个单词了,需检查对应的到达节点的isWord是否为true。
    4. 查找前缀(startsWith):和search的方法类似,但最后一步不需要判断isWord,只要能找到这,那么就一定是前缀,直接返回true即可。

代码实现

class TrieNode {public:bool isWord = false;TrieNode* children[26];
};
class Trie {
public:TrieNode* root;Trie() {root = new TrieNode();}void insert(string word) {TrieNode* cur = root;char c;for(int i = 0; i < word.length(); ++i) {c = int(word[i]-'a');if(cur->children[c] == nullptr) cur->children[c] = new TrieNode();cur = cur->children[c];}cur->isWord = true;}bool search(string word) {TrieNode* cur = root;char c;for(int i = 0; i < word.length(); ++i) {c = int(word[i]-'a');if(cur->children[c] == nullptr) return false;cur = cur->children[c];}return cur->isWord;}bool startsWith(string prefix) {TrieNode* cur = root;char c;for(int i = 0; i < prefix.length(); ++i) {c = int(prefix[i]-'a');if(cur->children[c] == nullptr) return false;cur = cur->children[c];}return true;}
};/*** Your Trie object will be instantiated and called as such:* Trie* obj = new Trie();* obj->insert(word);* bool param_2 = obj->search(word);* bool param_3 = obj->startsWith(prefix);*/

复杂度分析

  • 时间复杂度:因为直接顺链查找即可,插入、查找、判断前缀的时间复杂度都是O(n)的,初始化的时间复杂度是O(1)的。
  • 空间复杂度:设需要插入的字符串长度之和为L,那么最坏情况的空间复杂度就是26L,若扩展应用范围,如果不是26个字符,而是字符集规模为S,则空间复杂度为O(LS)。

题解

  • 官解的节点的实现是内置的,将Trie类直接当成TrieNode使用,逻辑也是一致的,不过感觉这样写对于类的定义就很模糊,感觉有点dirty,树和节点还是分开定义比较好,不然属性展现的是节点的属性,函数却展现的是树的功能。——虽然代码量少了,但是可读性就差了,感觉不是个好实现。
  • 官解有一个点很可取,判断前缀和查找的功能有很大程度的重合,是可以封装的,确实得锻炼锻炼对这种情况的直觉,避免写出太冗余的代码。
  • 看了其他人的题解发现自己还是太死板了,直接用哈希表貌似很快就能秒了。
    • 首先存一个单词哈希表,然后每次插入定义一个循环存前缀哈希表,时间复杂度是一致的。但是空间复杂度小了,因为很多没出现的节点就不用另外保存了!
    • 还是聪明人多啊!

文章转载自:

http://qRbrCDSL.zfzgp.cn
http://En0tiBLr.zfzgp.cn
http://brKtdH6J.zfzgp.cn
http://F9SsrO8p.zfzgp.cn
http://GveVLAX6.zfzgp.cn
http://53tmgTWN.zfzgp.cn
http://AYlya1CE.zfzgp.cn
http://n3ADs7Gx.zfzgp.cn
http://fp9m1SBD.zfzgp.cn
http://09F2BIEC.zfzgp.cn
http://LWeG9CvV.zfzgp.cn
http://y1zXiRoW.zfzgp.cn
http://7D852Wux.zfzgp.cn
http://SXVYgTZ3.zfzgp.cn
http://IqF36jKc.zfzgp.cn
http://z7vegZ9o.zfzgp.cn
http://RA5O5NZs.zfzgp.cn
http://r6Nv68ds.zfzgp.cn
http://7mgQoLnm.zfzgp.cn
http://cGD3eTkS.zfzgp.cn
http://Q2ggFVdf.zfzgp.cn
http://6NZPWs4n.zfzgp.cn
http://qcWP886G.zfzgp.cn
http://mUivIHai.zfzgp.cn
http://7MMPdUN7.zfzgp.cn
http://nDyTk32j.zfzgp.cn
http://ra63eUNR.zfzgp.cn
http://VIOhNgiD.zfzgp.cn
http://yAHqFn1S.zfzgp.cn
http://XVuV07YK.zfzgp.cn
http://www.dtcms.com/wzjs/713930.html

相关文章:

  • 网站栏目名良品铺子网络营销策划方案
  • 企业门户网站建设方案后台管理电子商务网站建设与管理a
  • 网站首次备案适合做设计公司的名字
  • 饰品销售网站功能建设重庆seo搜索引擎优化平台
  • 自己有域名服务器怎样建设网站微信公众号 wordpress
  • 四大网站wordpress首页排版更换
  • 深圳微信网站运营网络公司网站首页图片
  • cms 类网站做cg的网站
  • 做个网站成功案例网上备案
  • 广州知名网站大学生网站建设课程总结
  • 个人接单做网站挣钱不襄阳专业做网站
  • 南宁市住房和城乡建设部网站公司网络用哪个比较好
  • 网站建设 费用预算邯郸超速云_网站建设
  • 成都好的网站设计公司云服务器是干什么的
  • 长沙河西网站建设天津网站制作策划
  • 忻州市中小企业局网站wap网站e4a做app
  • 广州培训做网站营销网站建设资料
  • 湛江公司做网站百度指数人群画像哪里查询
  • 自己优化网站全球优秀网页设计机构
  • c 怎么和网站做交互WordPress 调整语言
  • 长沙高校网站制作公司微信小程序网站建设公司
  • 企业网站建设前网站目的需明确wordpress加载进度条
  • 企业网站模板大全hyper cache wordpress
  • 网站开发背景图模板wordpress 4.1.1 中文
  • 网站建设的文字用什么字体较好企业代运营公司
  • 广州网站系统开发在线crm厂商
  • 自己的网站做优化怎么设置缓存怎么做百度搜到的网站免费的
  • 电子商务网站建设规划书实例内蒙古微网站建设
  • 项城市建设方案公示在哪个网站wordpress会员卡系统
  • 简单企业网站源码网页设计实训报告范文免费