208、实现 Trie (前缀树)
https://leetcode-cn.com/problems/implement-trie-prefix-tree/submissions/
/**
*
* 执行用时: 56 ms
* 内存消耗: 49.3 MB
*/
class Trie {
private class Node {
public HashMap<Character, Node> childs;
public boolean isLeaf;
public Node() {
this.isLeaf = false;
this.childs = new HashMap<>();
}
}
private Node root;
public Trie() {
root = new Node();
}
/**
* Inserts a word into the trie.
*/
public void insert(String str) {
insert(root, str);
}
private void insert(Node root, String str) {
if (str == null || str.length() == 0) return;
char[] chars = str.toCharArray();
Node cur = root;
for (int i = 0, length = chars.length; i < length; i++) {
if (!cur.childs.containsKey(chars[i])) {
cur.childs.put(chars[i], new Node());
}
cur = cur.childs.get(chars[i]);
}
if (!cur.isLeaf)
cur.isLeaf = true;
}
/**
* Returns if the word is in the trie.
*/
public boolean search(String str) {
return search(root, str);
}
private boolean search(Node root, String str) {
if (str == null || str.length() == 0) return false;
char[] chars = str.toCharArray();
Node cur = root;
for (int i = 0, length = chars.length; i < length; i++) {
if (!cur.childs.containsKey(chars[i])) {
return false;
}
cur = cur.childs.get(chars[i]);
}
return cur.isLeaf;
}
/**
* Returns if there is any word in the trie that starts with the given prefix.
*/
public boolean startsWith(String str) {
if (str == null || str.length() == 0) return false;
char[] chars = str.toCharArray();
Node cur = root;
for (int i = 0, length = chars.length; i < length; i++) {
if (!cur.childs.containsKey(chars[i]))
return false;
cur = cur.childs.get(chars[i]);
}
return true;
}
}
/**
* 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);
*/