#码力全开·技术π对# 编写一个Java程序,设计并实现一个Trie(前缀树)的数据结构

问题:

编写一个Java程序,设计并实现一个​​Trie(前缀树)​​的数据结构,并实现以下方法:

  1. ​insert(String word)​​:插入一个单词到Trie中。
  2. ​search(String word)​​:查找Trie中是否存在这个单词。如果存在返回​​true​​,否则返回​​false​​。
  3. ​startsWith(String prefix)​​:判断Trie中是否存在以​​prefix​​为前缀的单词。如果存在返回​​true​​,否则返回​​false​​。

要求:

  • 请实现一个高效的解决方案,尽量减少空间和时间的复杂度。

提示:

  • 使用​​Map​​来表示每个Trie节点的子节点。
  • 考虑优化​​search​​和​​startsWith​​方法,避免重复遍历整个Trie树。
代码
CodePulse代码脉搏
2025-05-01 22:57:30
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Jimaks
Jimaks

基于Java的高效Trie实现方案,使用哈希表(HashMap)存储子节点,满足要求的时间复杂度O(m)和空间优化需求:

import java.util.HashMap;
import java.util.Map;

class TrieNode {
    Map<Character, TrieNode> children = new HashMap<>();
    boolean isEndOfWord;
}

public class Trie {
    private final TrieNode root;

    public Trie() {
        root = new TrieNode();
    }

    // 插入单词(时间复杂度O(m),m为单词长度)
    public void insert(String word) {
        TrieNode current = root;
        for (char c : word.toCharArray()) {
            current.children.putIfAbsent(c, new TrieNode());
            current = current.children.get(c);
        }
        current.isEndOfWord = true;
    }

    // 查找完整单词(时间复杂度O(m))
    public boolean search(String word) {
        TrieNode node = findNode(word);
        return node != null && node.isEndOfWord;
    }

    // 查找前缀(时间复杂度O(m))
    public boolean startsWith(String prefix) {
        return findNode(prefix) != null;
    }

    // 公共遍历方法避免代码重复
    private TrieNode findNode(String str) {
        TrieNode current = root;
        for (char c : str.toCharArray()) {
            if (!current.children.containsKey(c)) {
                return null;
            }
            current = current.children.get(c);
        }
        return current;
    }
}

实现要点解析

  1. 数据结构设计
  • ​TrieNode​​使用​​HashMap​​存储子节点,相比数组方案更节省空间(尤其处理非连续字符时)
  • ​isEndOfWord​​标记标识单词结束节点
  1. 时间复杂度优化
  • 插入/查找操作的时间复杂度均为O(m)(m为单词长度)
  • 公共​​findNode​​方法避免​​search​​和​​startsWith​​的代码重复
  1. 空间优化
  • 仅存储实际存在的字符节点,无预先分配空间
  • HashMap动态扩容机制适应不同规模数据

使用示例

public static void main(String[] args) {
    Trie trie = new Trie();
    trie.insert("apple");
    System.out.println(trie.search("apple"));   // true
    System.out.println(trie.search("app"));     // false
    System.out.println(trie.startsWith("app")); // true
    trie.insert("app");
    System.out.println(trie.search("app"));     // true
}

此实现满足以下要求:

  1. 高效处理字符串的插入和查询
  2. 支持前缀匹配和完整词匹配
  3. 空间复杂度最优(仅存储实际需要的字符节点)
  4. 处理Unicode字符(得益于HashMap特性)
分享
微博
QQ
微信https://www.51cto.com/aigc/
回复
2025-05-06 08:38:49
发布
相关问题
提问