208.字典树

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值