Problem
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.
Solution (Java)
class Trie {
private TrieNode root;
private boolean startWith;
private static class TrieNode {
// Initialize your data structure here.
public TrieNode[] children;
public boolean isWord;
public TrieNode() {
children = new TrieNode[26];
}
}
public Trie() {
root = new TrieNode();
}
// Inserts a word into the trie.
public void insert(String word) {
insert(word, root, 0);
}
private void insert(String word, TrieNode root, int idx) {
if (idx == word.length()) {
root.isWord = true;
return;
}
int index = word.charAt(idx) - 'a';
if (root.children[index] == null) {
root.children[index] = new TrieNode();
}
insert(word, root.children[index], idx + 1);
}
// Returns if the word is in the trie.
public boolean search(String word) {
return search(word, root, 0);
}
public boolean search(String word, TrieNode root, int idx) {
if (idx == word.length()) {
startWith = true;
return root.isWord;
}
int index = word.charAt(idx) - 'a';
if (root.children[index] == null) {
startWith = false;
return false;
}
return search(word, root.children[index], idx + 1);
}
// Returns if there is any word in the trie
// that starts with the given prefix.
public boolean startsWith(String prefix) {
search(prefix);
return startWith;
}
}
/**
* Your Trie object will be instantiated and called as such:
* Trie obj = new Trie();
* obj.insert(word);
* boolean param_2 = obj.search(word);
* boolean param_3 = obj.startsWith(prefix);
*/
Solution (Javascript)
var Node = function () {
this.children = {};
this.isWord = false;
};
/**
* Initialize your data structure here.
*/
var Trie = function() {
this.root = new Node();
};
/**
* Inserts a word into the trie.
* @param {string} word
* @return {void}
*/
Trie.prototype.insert = function(word) {
var len = word.length;
var node = this.root;
var char = 0;
for (var i = 0; i < len; i++) {
char = word[i];
if (!node[char]) node[char] = new Node();
node = node[char];
}
node.isWord = true;
};
/**
* Returns if the word is in the trie.
* @param {string} word
* @return {boolean}
*/
Trie.prototype.search = function(word) {
var len = word.length;
var node = this.root;
var char = 0;
for (var i = 0; i < len; i++) {
char = word[i];
if (!node[char]) return false;
node = node[char];
}
return node.isWord;
};
/**
* Returns if there is any word in the trie that starts with the given prefix.
* @param {string} prefix
* @return {boolean}
*/
Trie.prototype.startsWith = function(prefix) {
var len = prefix.length;
var node = this.root;
var char = 0;
for (var i = 0; i < len; i++) {
char = prefix[i];
if (!node[char]) return false;
node = node[char];
}
return true;
};
/**
* Your Trie object will be instantiated and called as such:
* var obj = Object.create(Trie).createNew()
* obj.insert(word)
* var param_2 = obj.search(word)
* var param_3 = obj.startsWith(prefix)
*/
Explain:
nope.
Complexity:
- Time complexity : O(h).
- Space complexity : O(h).