208.实现一个字典树
知识补充:
1.字典树:即单词查找树,Trie树,哈希树的变种。用于统计、排序、保存大量字符串(不仅限于字符串),在搜索引擎的词频统计中常用,利用公共前缀减少查询时间。
特点:
- 根节点不包含任何字符,除根节点之外,每个节点仅包含一个字符
- 从根节点起,到某个节点路径上的所有节点字符连接起来,为该节点对应的字符串
- 每个节点的所有子节点包含的字符各不相同
常用的api:
- insert(word):插入
- search(word):搜索
- startsWith(word):是否以某个单词开头
2.charCodeAt():返回指定字符的Unicode编码
题解
思路:实现三个函数,即插入,搜索,确认前缀
1.增加一个节点标识,判断当前节点是否是一个单词的结尾
function TrieNode(val){
this.val = val;
this.children = [];
this.isWord = false;
}
2.判断当前字符的索引位置
由于节点的每个子节点的值各不相同,给它设置一个独一无二的索引值
function computeIndex(c){
return c.charCodeAt(0)-"a".charCodeAt(0);
}
3.初始化字典树的结构
var Trie = function(){
this.root = new TrieNode(null);
}
4.insert实现
@param {String}
@return {Void}
Trie.prototype.insert = function(word){
let ws = this.root;
for(let i=0;i<word.length;i++){
let c = word[i];
let curr = computeIndex(c);
if(!ws.children[curr]){
ws.children[curr] = new TrieNode(c);
}
ws = ws.children[curr];
}
ws.isWord = true;
};
5.search实现
@params {String}
@return {Boolean}
Trie.prototype.search = function(word){
let ws = this.root;
for(let i=0;i<word.length;i++){
let c = word[i];
let curr = computeIndex(c);
if(!ws.children[curr]) return false;
ws = ws.children[curr];
}
return ws.isWord;
}
6.startsWith实现
@params {String}
@return {Boolean}
Trie.prototype.startsWith = function(prefix){
const ws = this.root;
for(let i=0;i<prefix.length;i++){
let c = prefix[i];
let curr = computeIndex(c);
if(!ws.children[curr]) return false;
ws = ws.children[curr];
}
return true;
}