208. 实现 Trie 前缀树(Trie)

这篇博客介绍了如何利用Trie(前缀树)数据结构来实现字符串的插入、搜索和前缀判断。代码示例展示了TrieNode类的构建,以及Trie类的insert、search和startsWith方法的实现。这些方法分别用于插入单词、查找单词以及判断字符串是否为其他单词的前缀。通过遍历字符并更新Trie结构,实现了高效的操作性能。
摘要由CSDN通过智能技术生成

@[toc](208. 实现 Trie (前缀树))

题目

实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。
在这里插入图片描述
说明:

  • 你可以假设所有的输入都是由小写字母 a-z 构成的。
  • 保证所有输入均为非空字符串。

解题思路

我们要构建一个Trie,且题目说所有的输入都是由小写字母 a-z 构成的。所以我们只给给trie的children定义为一个长度为26的数组就可以了。
再来看一下insert方法的实现:
首先我们需要遍历要插入的这个单词,将它拆分成一个个的char,在Trie去寻找一个个char是否存在,存在就往下走,不存在就在下标为c-'a'的位置新建出来该char。最后将isWord=true
剩下的两个方法大概思路都和插入差不多,只要看代码的注释就能明白。

代码

class Trie {
 class TrieNode{
     boolean isWord=false;
     TrieNode[] children;
     public TrieNode(){
         children=new TrieNode[26];//因为本次的输入是26个小写英文字母,所以孩子节点就设置成一个长度为26的数组
     }
 }
    /** Initialize your data structure here. */
    TrieNode root;
    public Trie() {
        root=new TrieNode();//构造出来根节点
    }
    
    /** Inserts a word into the trie. */
    public void insert(String word) {
        TrieNode cur=root;
        for(int i =0;i<word.length();i++){
            char c=word.charAt(i);//分割出来字符
            //c-'a' 得到的是数字, 比如'a'-'a'=0;'b'-'a'=1;
            if(cur.children[c-'a']==null){//cur节点的[c-'a']下标处没有东西,证明没有该字符在trie中。
                cur.children[c-'a']=new TrieNode();//没有就新建一个
            }

            //如果有该节点,那么就要走到该节点去。
            cur=cur.children[c-'a'];
        }
        cur.isWord=true; //经过上面的循环整个单词已经插入完成了,所以把isWord置为true
    }
    
    /** Returns if the word is in the trie. */
    public boolean search(String word) {
    TrieNode cur=root;
        for(int i =0;i<word.length();i++){
            char c=word.charAt(i);//分割出来字符
            //c-'a' 得到的是数字, 比如'a'-'a'=0;'b'-'a'=1;
            if(cur.children[c-'a']==null){//cur节点的[c-'a']下标处没有东西,证明没有该字符在trie中。
                return false;//搜索到一个字符没有就直接返回false。比如cat,你都搜索到a没有了,就不用往下搜索了
            }

            //如果有该字符,那么就要走到该节点去。再继续往下搜索
            cur=cur.children[c-'a'];
        }
        return cur.isWord;//有归有,是不是单词还要看它的isWord属性来判定。
    }
    
    /** Returns if there is any word in the trie that starts with the given prefix. */
    public boolean startsWith(String prefix) {
        TrieNode cur=root;
        for(int i =0;i<prefix.length();i++){
            char c=prefix.charAt(i);//分割出来字符
            //c-'a' 得到的是数字, 比如'a'-'a'=0;'b'-'a'=1;
            if(cur.children[c-'a']==null){//cur节点的[c-'a']下标处没有东西,证明没有该字符在trie中。
                return false;//搜索到一个字符没有就直接返回false。比如cat,你都搜索到a没有了,就不用往下搜索了
            }

            //如果有该字符,那么就要走到该节点去。再继续往下搜索
            cur=cur.children[c-'a'];
        }
        return true;//全找到的直接返回true
    }
}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值