Leetcode 208 solution: Implement Trie (Prefix Tree)
阅读原文
https://blog.baozitraining.org/2019/04/leetcode-solution-208-implement-trie.html
Problem Statement
Implement a trie with insert
, search
, and startsWith
methods.
Example:
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple"); // returns true
trie.search("app"); // returns false
trie.startsWith("app"); // returns true
trie.insert("app");
trie.search("app"); // returns true
Note:
- You may assume that all inputs are consist of lowercase letters
a-z
. - All inputs are guaranteed to be non-empty strings.
Problem link
Video Tutorial
You can find the detailed video tutorial here
Thought Process
Trie (prefix tree) is a very common data structure that appears very often in interviews. I used to get asked Trie at Fitbit, Snap and Google back in the days. I highly recommend you brush up on this basic data structure. Please refer to this Baozi Training Blog for a modified version explained: https://blog.baozitraining.org/2019/03/leetcode-solution-211-add-and-search.html Leetcode actually did a great job explaining this problem. Feel free to download the explanation here (all credit and copyright goes to leetcode, obviously)
public class TrieNode {
public Character letter = null;
// a boolean to indicate if this node is end of a word, sometimes we want to match word exactly, not just prefix
public boolean isEnd = false;
public Map<Character, TrieNode> children = null;
// Initialize your data structure here.
public TrieNode() {
this.children = new HashMap<Character, TrieNode>();
}
}
public TrieNode root;
public ImplementTrie() {
// This root node essentially is a dummy root
this.root = new TrieNode();
}
// This is my fitbit onsite version, looks cool
public void insert(String word) {
if (word == null || word.length() == 0) {
return;
}
TrieNode cur = this.root;
int i = 0;
while (i < word.length()) {
char c = word.charAt(i);
if (!cur.children.containsKey(c)) {
cur.children.put(c, new TrieNode());
}
cur = cur.children.get(c);
i++;
}
cur.isEnd = true;
}
// Returns if the word is in the trie, it has to be the exact word
public boolean search(String word) {
if (word == null || word.length() == 0) {
return false;
}
int i = 0;
TrieNode cur = this.root;
while (i < word.length()) {
char c = word.charAt(i);
if (!cur.children.containsKey(c)) {
return false;
}
cur = cur.children.get(c);
i++;
}
return cur.isEnd;
}
// Returns if there is any word in the trie
// that starts with the given prefix.
public boolean startsWith(String prefix) {
if (prefix == null || prefix.length() == 0) {
return false;
}
int i = 0;
TrieNode cur = this.root;
// Nice, this means if prefix is empty, it can match everything, if it's " " space, then it won't match unless there is a space
while (i < prefix.length()) {
char c = prefix.charAt(i);
if (!cur.children.containsKey(c)) {
return false;
}
cur = cur.children.get(c);
i++;
}
return true;
}
Time Complexity: assuming N is the word length, insert O(N), search O(N), startWith O(N) Space Complexity: assuming N is the word length, insert O(N), search O(1), startWith O(1)
References
- Leetcode official solution
- struts的声明式异常处理 demo
- npm管理工具介绍
- 对windows密码抓取神器mimikatz的逆向分析
- Keras中神经网络模型的5阶段生命周期
- java的断言(assert)
- Android studio中Rendering Problems不能可视化操作的解决办法
- 使用 Referer Meta 标签控制 referer—详解 referrer-policy
- 网站抓取引子 - 获得网页中的表格
- Android Firebase 服务简介
- CVE-2015-0393:Oracle发布严重安全漏洞预警
- 研究人员发现一种利用Siri窃取苹果iPhone/iPad数据的方法
- 关于Python中的__main__和编程模板
- 世界大战尽在掌控:盘点全球网络攻击实时追踪系统
- Activity数据传递
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 从0开始打造UI框架:动态化框架Scrollview物理学算法解析
- 基于Keras的格式化输出Loss实现方式
- PHP信号处理机制的操作代码讲解
- php防止表单重复提交实例讲解
- Python实现封装打包自己写的代码,被python import
- 创建一个 Serverless 应用,真的没有这么难!
- PHP使用mongoclient简单操作mongodb数据库示例
- 基于TensorFlow的CNN实现Mnist手写数字识别
- django rest framework 自定义返回方式
- PHP+Ajax实现的检测用户名功能简单示例
- Yii框架学习笔记之session与cookie简单操作示例
- Ajax+Jpgraph实现的动态折线图功能示例
- Python闭包及装饰器运行原理解析
- Django中Q查询及Q()对象 F查询及F()对象用法
- keras.layer.input()用法说明