Java中的字典树,也叫前缀树,是一种基于字符串快速查找的数据结构。它的基本性质是:根节点为空,每个节点代表一个字母,沿着从根节点到叶子节点的路径可以得到一个字符串。通过在树形结构中查找匹配的字符串,可以实现对字符串的高效管理和检索。
具体实现过程如下:
一、数据结构定义
我们可以采用一个节点类,来定义字典树中的每个节点。代码如下:
class TrieNode {
public char val;
public boolean isWord;
public TrieNode[] children = new TrieNode[26];
public TrieNode() {}
TrieNode(char c){
TrieNode node = new TrieNode();
node.val = c;
}
}
其中,val代表节点存储的字母,isWord代表当前节点是否为某个单词的结尾,children代表子节点数组。
二、插入字符串
插入字符串,即构建字典树的过程。下面是Java的实现:
class Trie{
TrieNode root;
public Trie() {
root = new TrieNode();
root.val = ' ';
}
public void insert(String word) {
TrieNode node = root;
for(int i = 0; i < word.length(); ++i) {
char c = word.charAt(i);
if(node.children[c - 'a'] == null){
node.children[c - 'a'] = new TrieNode(c);
}
node = node.children[c - 'a'];
}
node.isWord = true;
}
}
三、查询单词
查询单词实际上就是在字典树中查找指定单词对应的节点。如果最后一个节点isWord为true,说明该单词存在字典树中,否则就不存在。
class Trie{
// ...
public boolean search(String word) {
TrieNode node = root;
for(int i = 0; i < word.length(); ++i) {
char c = word.charAt(i);
if(node.children[c - 'a'] == null){
return false;
}
node = node.children[c - 'a'];
}
return node.isWord;
}
}
四、前缀匹配
前缀匹配指查找以某字符串为前缀的所有单词。下面是Java的实现:
class Trie{
// ...
public boolean startsWith(String prefix) {
TrieNode node = root;
for(int i = 0; i < prefix.length(); ++i) {
char c = prefix.charAt(i);
if(node.children[c - 'a'] == null){
return false;
}
node = node.children[c - 'a'];
}
return true;
}
}
至此,字典树的Java实现过程就非常清晰了。接下来,我们可以使用以下两个示例说明:
示例1:将以下单词插入字典树中,并判断是否包含"apple"和"orange"两个单词
public static void main(String[] args) {
Trie trie = new Trie();
trie.insert("apple");
trie.insert("orange");
System.out.println("contains apple: " + trie.search("apple"));
System.out.println("contains orange: " + trie.search("orange"));
System.out.println("contains grapes: " + trie.search("grapes"));
}
输出结果为:
contains apple: true
contains orange: true
contains grapes: false
示例2:使用前缀匹配查询是否有字符串以"app"开头
public static void main(String[] args) {
Trie trie = new Trie();
trie.insert("apple");
trie.insert("application");
trie.insert("banana");
trie.insert("orange");
System.out.println("startsWith app: " + trie.startsWith("app"));
}
输出结果为:
startsWith app: true
至此,我们完成了Java中关于字典树的算法实现的详细讲解,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中关于字典树的算法实现 - Python技术站