当前位置: 首页 > article >正文

数据结构与算法之堆: LeetCode 208. 实现 Trie (前缀树) (Ts版)

实现 Trie (前缀树)

  • https://leetcode.cn/problems/implement-trie-prefix-tree/description/

描述

  • Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查

  • 请你实现 Trie 类:

    • Trie() 初始化前缀树对象
    • void insert(String word) 向前缀树中插入字符串 word
    • boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false
    • boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false

示例

输入
["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
[[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
输出
[null, null, true, false, true, null, true]

解释
Trie trie = new Trie();
trie.insert(“apple”);
trie.search(“apple”); // 返回 True
trie.search(“app”); // 返回 False
trie.startsWith(“app”); // 返回 True
trie.insert(“app”);
trie.search(“app”); // 返回 True

提示

  • 1 <= word.length, prefix.length <= 2000
  • word 和 prefix 仅由小写英文字母组成
  • insert、search 和 startsWith 调用次数 总计 不超过 3 * 1 0 4 10^4 104

Typescript 版算法实现


1 ) 方案1: 字典树

class TrieNode {
    children: { [key: string]: TrieNode } = {};
    isEnd: boolean = false;
}

class Trie {
    private root: TrieNode;

    constructor() {
        this.root = new TrieNode();
    }

    insert(word: string): void {
        const node = this.root;
        for (const ch of word) {
            if (!node.children[ch]) {
                node.children[ch] = new TrieNode();
            }
            node = node.children[ch];
        }
        node.isEnd = true;
    }

    private searchPrefix(prefix: string): TrieNode | null {
        const node = this.root;
        for (const ch of prefix) {
            if (!node.children[ch]) {
                return null;
            }
            node = node.children[ch];
        }
        return node;
    }

    search(word: string): boolean {
        const node = this.searchPrefix(word);
        return node !== null && node.isEnd === true;
    }

    startsWith(prefix: string): boolean {
        const node = this.searchPrefix(prefix);
        return node !== null;
    }
}

/**
 * Your Trie object will be instantiated and called as such:
 * var obj = new Trie()
 * obj.insert(word)
 * var param_2 = obj.search(word)
 * var param_3 = obj.startsWith(prefix)
 */

2 ) 方案2: 另一种方案

// 定义Trie节点的接口
interface TrieNode {
  [char: string]: TrieNode | boolean; // 字符映射到另一个Trie节点或标记单词结束的布尔值
}
 
class Trie {
  private root: TrieNode = {}; // 使用接口定义的Trie节点作为根节点
 
  /** 
   * 向Trie中插入一个单词
   * @param word 要插入的单词
   */
  insert(word: string): void {
    let currentNode: TrieNode = this.root;
    for (const ch of word) {
      if (!(ch in currentNode)) {
        currentNode[ch] = {} as TrieNode; // 使用类型断言来确保是TrieNode类型
      }
      currentNode = currentNode[ch] as TrieNode;
    }
    currentNode.end = true; // 标记单词结束
  }
 
  /** 
   * 搜索Trie中是否包含一个单词
   * @param word 要搜索的单词
   * @returns 如果包含单词,则返回true;否则返回false
   */
  search(word: string): boolean {
    const searchResult = this.startsWith(word);
    return searchResult !== false && 'end' in searchResult && searchResult.end === true;
  }
 
  /** 
   * 检查Trie中是否包含具有给定前缀的单词
   * @param prefix 要检查的前缀
   * @returns 如果存在前缀,则返回对应的TrieNode;否则返回false
   */
  startsWith(prefix: string): TrieNode | false {
    let currentNode: TrieNode = this.root;
    for (const ch of prefix) {
      if (!(ch in currentNode)) {
        return false; // 前缀不存在,返回false
      }
      currentNode = currentNode[ch] as TrieNode;
    }
    return currentNode; // 返回对应的TrieNode
  }
}

http://www.kler.cn/a/518747.html

相关文章:

  • 通过配置核查,CentOS操作系统当前无多余的、过期的账户;但CentOS操作系统存在共享账户r***t
  • JS面相对象小案例:自定义安全数组
  • 【6】YOLOv8 训练自己的分割数据集
  • PHP防伪溯源一体化管理系统小程序
  • Linux 磁盘管理
  • 【Git版本控制器--3】Git的远程操作
  • Java面试题2025-Mysql
  • Pandas与Numpy的数据分析进阶题
  • 免费GPU算力,不花钱部署DeepSeek-R1
  • 【由浅入深认识Maven】第2部分 maven依赖管理与仓库机制
  • 基于大语言模型构建本地个人AI助理
  • WebRtc06: 音视频数据采集
  • ICSE‘25 LLM Assistance for Memory Safety
  • 【面试】【程序员基本知识】计算机网络,设计模式,正则,安全
  • 一文简单回顾复习Java基础概念
  • InfiniBand客户端注册机制详解:ib_register_client函数的作用与实现
  • DDD架构实战第六讲总结:领域驱动设计中的聚合
  • 近年流行的开发技术
  • 02-AD-绘制原理图(画示意图+添加已有P封装)
  • MySQL核心知识:春招面试数据库要点
  • PyQt6医疗多模态大语言模型(MLLM)实用系统框架构建初探(上.文章部分)
  • 使用 Serilog 在 .NET Core 6.0 中日志记录
  • Linux 部署 Java 项目:Tomcat、Redis、MySQL 教程
  • 速通Docker === Dockerfile
  • 计算机网络 (61)移动IP
  • 电商平台爬虫开发技术分享:多年的实战经验总结