【LeetCode】【算法】208. 实现 Trie (前缀树)

LeetCode 208. 实现 Trie (前缀树)

题目描述

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]

思路

思路类似于一个26叉树,每一个节点存储的是一个字母。

插入就是沿着这个路径不断向下走,或创建下一层的26叉节点(仅当[i]下面一层的节点为空时创建)。当且仅当遍历到单词的最后一个字符时将isEnd标志位为true。

search和startwith实际上都可以依赖于一个前缀搜索方法"searchPrefix"。在前缀搜索方法中,对于给定的字符串word,从前缀树一层一层向下搜索,具体来说,用for循环遍历word,if(node.children[prefix.charAt(i)-'a']!=null){node=node.children[prefix.charAt(i)-'a']},如果出现这个孩子节点为null,则说明该前缀不存在,return null

search就是看返回结果是否为null&&该结果的isEnd标志位是否为True

startwith只需要判断返回结果是否为null就好

代码

java 复制代码
class Trie {
    private Trie[] children;
    private boolean isEnd;

    public Trie() {
        children = new Trie[26];
        isEnd = false;
    }

    public void insert(String word) {
        Trie node = this;
        for (int i = 0; i < word.length(); i++){
            char c = word.charAt(i);
            int index = c - 'a';
            if (node.children[index] == null) {
                node.children[index] = new Trie();
            }
            node = node.children[index];// node移动到下面一层
        }
        node.isEnd = true;
    }

    public boolean search(String word) {
        Trie node = searchPrefix(word);
        return node != null && node.isEnd;
    }

    public boolean startsWith(String prefix) {
        return searchPrefix(prefix) != null;
    }

    private Trie searchPrefix(String prefix){
        Trie node = this;
        for (int i = 0; i < prefix.length(); i++){
            char c = prefix.charAt(i);
            int index = c - 'a';
            if (node.children[index] == null){
                return null;
            }
            node = node.children[index];
        }
        return node;
    }
}

/**
 * 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);
 */
相关推荐
网易独家音乐人Mike Zhou36 分钟前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
Swift社区4 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman5 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
IT 青年5 小时前
数据结构 (1)基本概念和术语
数据结构·算法
Dong雨6 小时前
力扣hot100-->栈/单调栈
算法·leetcode·职场和发展
SoraLuna6 小时前
「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解
开发语言·算法·macos·cangjie
liujjjiyun6 小时前
小R的随机播放顺序
数据结构·c++·算法
¥ 多多¥6 小时前
c++中mystring运算符重载
开发语言·c++·算法
trueEve7 小时前
SQL,力扣题目1369,获取最近第二次的活动
算法·leetcode·职场和发展
天若有情6737 小时前
c++框架设计展示---提高开发效率!
java·c++·算法