Believing Process 力扣Hot208.实现Trie(前缀树)

题干:

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

 

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 ch = word.charAt(i);
                int index = ch-'a';
                if(node.children[index]==null){
                    node.children[index] = new Trie();
                }
                node = node.children[index];
            }
            node.isEnd = true;
        }
        private Trie searchPrefix(String prefix){
            Trie node = this;
            for(int i=0;i<prefix.length();i++){
                char ch = prefix.charAt(i);
                int index = ch-'a';
                if(node.children[index]==null) return null;
                node = node.children[index];
            }
            return node;
        }
        public boolean search(String word) {
            Trie node = searchPrefix(word);
            if(node!=null&&node.isEnd){
                return true;
            }
            return false;
        }

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

        前缀树是一个多叉树,根据此题我们可以构建一个特定的前缀树(包含26个英文字母的Trie数组,每一个下标对应一个字母,以及一个表明当前节点是否为结尾的isEnd标志)

        insert操作:遍历当前字符串,根据每一个字符所在的位置创建对应的子前缀树,再把最后一个节点的isEnd标志置为true,表明从根节点到当前节点的路径就是我们插入的字符串。

       search操作:通过一个searchPrefix函数,查找当前字符串对应的前缀树链是否存在,若存在,则searchPrefix返回树链的末尾节点,不存在则返回为空。当searchPrefix返回为空时,表明没找到;若返回了末尾节点,且末尾节点的isEnd为true,则表明查找到了。

        startsWith操作:其实就是searchPrefix操作,只需要判断searchPrefix是否返回空即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值