[LeetCode]Implement Trie(Prefix Tree),解题报告
2015-05-15 14:12
387 查看
目录
目录概述
Trie树基本实现
定义Trie树节点
添加操作
查询word是否在Trie树中
AC完整代码
概述
Trie树,又称为字典树、单词查找树或者前缀树,是一种用于快速检索的多叉数结构。例如,英文字母的字典树是26叉数,数字的字典树是10叉树。Trie树的基本性质有三点,归纳为:
根节点不包含字符,根节点外每一个节点都只包含一个字符。
从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
每个节点的所有子节点包含的字符串不相同。
Trie树基本实现
我们通过LeetCode的上的一道Trie题目来描述Trie树的实现。Implement Trie(Prefix Tree)。定义Trie树节点
class TrieNode { boolean isWord; HashMap<Character, TrieNode> nexts; public TrieNode() { nexts = new HashMap<Character, TrieNode>(); } }
添加操作
我们向Trie树中添加一个字符串word,具体步骤如下:// Inserts a word into the trie. public void insert(String word) { char[] s = word.toCharArray(); TrieNode p = root; int i = 0, n = s.length; // traverse existing while (i < n) { TrieNode next = p.nexts.get(s[i]); if (next != null) { p = next; i ++; } else { break; } } // append new nodes while (i < n) { TrieNode newTrie = new TrieNode(); p.nexts.put(s[i], newTrie); p = newTrie; i ++; } // set word end p.isWord = true; }
查询word是否在Trie树中
// Returns if the word is in the trie. public boolean search(String word) { TrieNode p = root; for (int i = 0; i < word.length(); i ++) { TrieNode child = p.nexts.get(word.charAt(i)); if (child == null) { return false; } p = child; } return p.isWord; } // Returns if there is any word in the trie // that starts with the given prefix. public boolean startsWith(String prefix) { TrieNode p = root; for (int i = 0; i < prefix.length(); i ++) { TrieNode child = p.nexts.get(prefix.charAt(i)); if (child == null) { return false; } p = child; } return true; }
AC完整代码
import java.util.HashMap;
class TrieNode { boolean isWord; HashMap<Character, TrieNode> nexts; public TrieNode() { nexts = new HashMap<Character, TrieNode>(); } }
public class Trie {
private TrieNode root;
public Trie() {
root = new TrieNode();
}
// Inserts a word into the trie.
public void insert(String word) {
char[] s = word.toCharArray();
TrieNode p = root;
int i = 0, n = s.length;
// traverse existing
while (i < n) {
TrieNode next = p.nexts.get(s[i]);
if (next != null) {
p = next;
i ++;
} else {
break;
}
}
// append new nodes
while (i < n) {
TrieNode newTrie = new TrieNode();
p.nexts.put(s[i], newTrie);
p = newTrie;
i ++;
}
// set word end
p.isWord = true;
}
// Returns if the word is in the trie.
public boolean search(String word) {
TrieNode p = root;
for (int i = 0; i < word.length(); i ++) {
TrieNode child = p.nexts.get(word.charAt(i));
if (child == null) {
return false;
}
p = child;
}
return p.isWord;
}
// Returns if there is any word in the trie
// that starts with the given prefix.
public boolean startsWith(String prefix) {
TrieNode p = root;
for (int i = 0; i < prefix.length(); i ++) {
TrieNode child = p.nexts.get(prefix.charAt(i));
if (child == null) {
return false;
}
p = child;
}
return true;
}
public static void main(String[] args) {
Trie trie = new Trie();
trie.insert("keydsdsds");
System.out.println(trie.startsWith("key"));
}
}
相关文章推荐
- 【LeetCode】208. Implement Trie (Prefix Tree) 解题报告(Python)
- [leetcode] 208. Implement Trie (Prefix Tree) 解题报告
- [LeetCode] Implement Trie (Prefix Tree)
- LeetCode "Implement Trie (Prefix Tree)"
- java 前缀树实现 leetcode 208: Implement Trie (Prefix Tree)
- LeetCode208 --- Implement Trie (Prefix Tree)
- LeetCode——Implement Trie (Prefix Tree)
- [LeetCode][JavaScript]Implement Trie (Prefix Tree)
- LeetCode 208 Implement Trie (Prefix Tree)
- LeetCode 208 Implement Trie (Prefix Tree)
- [leetcode] Implement Trie (Prefix Tree)
- Leetcode208-Implement Trie (Prefix Tree)
- LeetCode - Implement Trie (Prefix Tree)
- LeetCode 208: Implement Trie (Prefix Tree)
- leetcode 日经贴,Cpp code -Implement Trie (Prefix Tree)
- Leetcode 208: Implement Trie (Prefix Tree)
- LeetCode -- Implement Trie (Prefix Tree)
- leetcode:Implement Trie (Prefix Tree)
- LeetCode: Implement Trie (Prefix Tree)
- Leetcode: Implement Trie (Prefix Tree)