当前位置: 首页 > Web前端 > JavaScript

[算法]Prefixtree

时间:2023-03-26 21:49:51 JavaScript

prefixtreePrefixtree主要用来解决字符串搜索相关的问题。如果字符串的长度为k,由于在前缀树中查找字符串相当于沿着前缀树的路径查找字符串的每一个字符,所以时间复杂度为O(k)。在哈希表中,只有输入完整的字符串才能进行查找操作,而在前缀树中则没有这种限制。例如,只输入一个字符串的前几个字符,即一个前缀,就可以找到所有以该前缀开头的字符串。如果需要根据字符串的前缀进行查找,那么前缀树的合理应用可能是解决这个问题的关键。现实前显树/***在这里初始化你的数据结构。*/varTrie=function(){this.children={};};/***在trie中插入一个词。*@param{string}word*@return{void}*/Trie.prototype.insert=function(word){letnode=this.children;for(constchofword){if(!node[ch]){node[ch]={};}节点=节点[ch];}node.isEnd=true;};Trie.prototype.searchPrefix=function(prefix){让节点=this.children;for(constchofprefix){if(!node[ch]){returnfalse}node=node[ch]}returnnode;}/***如果单词在trie中则返回。*@param{string}word*@return{boolean}*/Trie.prototype.search=function(word){constnode=this.searchPrefix(word)returnnode!==undefined&&node.isEnd!==undefined;};/***返回trie中是否有任何以给定前缀开头的单词。*@param{string}前缀*@return{boolean}*/Trie.prototype.startsWith=function(prefix){returnthis.searchPrefix(prefix);};替换单词英语中有一个概念,就是在词根后加入一些字符,可以拼出一个更长的单词。例如,“an”是一个词根,向其添加“other”会产生另一个词“another”。现在给定一个词根词典和一个英语句子,如果句子中的一个词在词典中有词根,则用词根替换该词;如果这个词没有词根,就保留这个词。请输出替换后的句子。例如,如果根字典包含字符串["cat","bat","rat"]并且英文句子是“thecattlewasrattledbybattery”,那么替换后的句子就是“thecatwasratby球棒”。/***@param{string[]}dictionary*@param{string}sentence*@return{string}*/varreplaceWords=function(dictionary,sentence){letchildren={}//构建前缀树for(let字典中的单词){让节点=孩子们;for(letchofword){if(!node[ch]){node[ch]={}}node=node[ch]}node.isEnd=true}返回语句.split('').map(word=>{letnode=children,tmp=''for(letwofword){node=node[w]tmp+=wif(!node||node.isEnd)break}returnnode&&node.isEnd?tmp:word}).join('')};MagicDictionary标题:请通过以下两个操作实现魔法字典。●函数buildDict,输入单词数组创建字典●函数search,输入一个单词,判断单词中的某个字符是否可以修改,使修改后的单词为字典中的单词。/***在这里初始化你的数据结构。*/varMagicDictionary=function(){this.dictionary=[]};/***@param{string[]}dictionary*@return{void}*/MagicDictionary.prototype.buildDict=function(dictionary){this.dictionary=dictionary};/***@param{string}searchWord*@return{boolean}*/MagicDictionary.prototype.search=function(searchWord){for(constdictofthis.dictionary){if(dict.length==searchWord.length){letdiff=0for(leti=0;i1)break}if(diff==1)返回true}}returnfalse};最短词编码词数组words的有效编码由任意助记词串s和下标数组索引组成,满足:words.length==indices.length助记词串s以'#'字符结尾对于每个下标indices[i],其中一个s从indices[i]开始并以下一个'#'字符结束(但不包括包含'#'的子串)正好等于words[i]/***@param{string[]}words*@返回{number}*/varminimumLengthEncoding=function(words){constset=newSet(words)for(constwordofset){for(leti=1;i=0;j--){letattr=(nums[i]>>j)&1;if(!node[attr]){node[attr]={};}节点=节点[属性];}}让最大值=0;for(leti=0;i=0;j--){letbit=(nums[i]>>j)&1;让指数=位^1;如果(节点[索引]){结果|=(1<