java数据结构与算法刷题-----LeetCode208. 实现 Trie (前缀树)

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

文章目录

在这里插入图片描述

解题思路
  1. 就是一种数据结构,一般自动补完,拼写检查都可以用这种数据结构。
  2. 比如题目要求的这棵前缀树,只保存单词。
  3. 那么我们每个结点就可以保存26个字母,也就是26叉树,每个结点都有26个子结点,每个结点都有26种可能,这些结点最终可以组成所有单词。
  4. 说白了就是通过穷举法,设定前缀。比如第一个字母可以是a-z任意一个, 第二个字母也可以是a-z.第一个就算只选择一个c,第二个选择a-z任意一个,都有26种可能。也就是说,就算只有2层结点就有26*26种不同的组成
  5. 如何知道当前前缀是否是一个完整单词呢?

可以在结点对象增加一个标志位isEnd,例如apple,那么它们每个字母的标志位为[F,F,F,F,T],也就是完全匹配apple,才能访问到这个前缀的最后一个字母e,才可以获得它的isEnd = true。例如只匹配到appl,此时最后一个匹配的字符是l。因为apple才是完整的单词,l标志位是false,就说明不是完整单词

代码

在这里插入图片描述

class Trie {
    private final int R = 26;//规定一个结点可以保存26个元素
    private Trie[] children;//子结点
    private boolean isEnd;//当前结点是否表示一个前缀的完整匹配
    public Trie() {
        children= new Trie[R];//每个结点有26棵子树,代表26个字母
        isEnd = false;
    }
    //插入一个前缀
    public void insert(String word) {
        Trie tmp = this;
        for (char i : word.toCharArray()) {//将每个字符插入
            if (tmp.children[i - 'a'] == null) {//如果当前结点是第一次访问
                tmp.children[i - 'a'] = new Trie();//创建新结点
            }
            tmp = tmp.children[i - 'a'];//匹配下一个字符
        }
        tmp.isEnd = true;
    }
    //是否完全匹配
    public boolean search(String word) {
        Trie tmp = this;//hash遍历
        for (char i : word.toCharArray()) {
            if (tmp.children[i - 'a'] == null) {//如果匹配不成功
                return false;//返回false
            }
            tmp = tmp.children[i - 'a'];//否则匹配下一个字符
        }
        //字符都匹配成功后
        return tmp.isEnd;//看看当前这个字符,是否是一个前缀的最后一个字符,如果是返回true,不是返回false

    }
    //这个只要保证字符都对应即可,无需通过isEnd确定是否完全匹配前缀
    public boolean startsWith(String prefix) {
        Trie tmp = this;
        for (char i : prefix.toCharArray()) {
            if (tmp.children[i - 'a'] == null) {
                return false;
            }
            tmp = tmp.children[i - 'a'];
        }
        return true;//当字符匹配成功后,不用看isEnd来确定是否完全匹配一个前缀,直接返回ture即可
    }
}

/**
 * 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);
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值