html5国内网站欣赏,中国全案设计联盟,手机网站教程,自适应型网站建设方案1、前缀树基础
前缀树又称为字典树#xff0c;它用一个树状的数据结构存储一个字典中的所有单词#xff0c;如图前缀树是一棵多叉树#xff0c;一个节点可能有多个子节点#xff0c;字典树的话子节点最多为26个#xff08;26个英文单词#xff09;。前缀树中除根节点外它用一个树状的数据结构存储一个字典中的所有单词如图前缀树是一棵多叉树一个节点可能有多个子节点字典树的话子节点最多为26个26个英文单词。前缀树中除根节点外每个节点表示字符串中的一个字符而字符串由前缀树的路径表示。前缀树的根节点不表示任何字符前缀树路径字符串在前缀树中的路径并不一定终止于叶节点。如果一个单词时另一个单词的前缀那么较短的单词对应的路径是较长的单词对应的路径的一部分。如果前缀树路径到达某个节点时表示了一个完整的字符串则字符串最后一个字符对应的结点有特殊的标识。2、LCR 062. 实现 Trie (前缀树)题目信息https://leetcode.cn/problems/QC3q1f/description/Trie发音类似try或者说 前缀树 是一种树形数据结构用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景例如自动补完和拼写检查。 请你实现 Trie 类Trie()初始化前缀树对象。voidinsert(String word)向前缀树中插入字符串 word 。 booleansearch(String word)如果字符串 word 在前缀树中返回true即在检索之前已经插入否则返回false。 booleanstartsWith(String prefix)如果之前已经插入的字符串 word 的前缀之一为 prefix 返回true否则返回false。 示例 输入 inputs[Trie,insert,search,search,startsWith,insert,search]inputs[[],[apple],[apple],[app],[app],[app],[app]]输出[null,null,true,false,true,null,true]解释 Trie trienewTrie();trie.insert(apple);trie.search(apple);// 返回 Truetrie.search(app);// 返回 Falsetrie.startsWith(app);// 返回 Truetrie.insert(app);trie.search(app);// 返回 True提示1word.length,prefix.length2000word 和 prefix 仅由小写英文字母组成 insert、search 和 startsWith 调用次数 总计 不超过3*104次解题思路1、审题前缀树实现前缀树是一颗多叉树如果规定前缀树节点值保存的小写字母则多叉树的子树大小为2626个英文字母个数2、解题实现二叉树的字符串插入insert字符串查询search和前缀字符判断startsWith在构造函数中定义一个26个大小的数组用于标示当前结点的子节点保存位置当调用insert方法插入字符串时先找到根节点遍历字符串并从前缀树的根节点开始判断遍历到的字符在前缀树中是否存在如果不存在则新建该字符标识的结点直到字符串全部遍历完并将该结点标识为是单个单词查询方法search和前缀树内容判断也是类似的思路代码实现classTrie{public:Trie(){rootnewTrieNode();}classTrieNode// 内部类{public:boolisWordfalse;TrieNode*children[26];// 数组TrieNode(){for(inti0;i26;i){children[i]nullptr;}}~TrieNode(){for(inti0;i26;i){deletechildren[i];children[i]nullptr;}}};/** Inserts a word into the trie. */voidinsert(string word){TrieNode*noderoot;for(inti0;iword.length();i){intindexword[i]-a;if(node-children[index]nullptr){node-children[index]newTrieNode();}nodenode-children[index];}node-isWordtrue;}/** Returns if the word is in the trie. */boolsearch(string word){TrieNode*noderoot;for(inti0;iword.length();i){intindexword[i]-a;if(node-children[index]nullptr){returnfalse;}nodenode-children[index];}returnnode-isWord;}/** Returns if there is any word in the trie that starts with the given prefix. */boolstartsWith(string prefix){TrieNode*noderoot;for(inti0;iprefix.length();i){intindexprefix[i]-a;if(node-children[index]nullptr){returnfalse;}nodenode-children[index];}returntrue;}private:TrieNode*root;};3、总结前缀树概念字典树是多叉树每个单词对应树的一条路径每个节点对应单词的结点单词结束位置的结点有特殊标记位 isWord前缀树的创建与查询将单词插入到前缀树中根据单词的字符查找对应位置的结点是否存在不存在的话则新建结点并重新赋值。单词查询方式也一样的逻辑根据遍历到的字符位置查找结点直到单词结尾的结点并判断是否有结束标识。