Leecode刷题笔记——208. 实现 Trie (前缀树)

在这里插入图片描述
思路如下:
这是一个Trie底层实现问题,有关Trie原理参照:
Trie树实现原理

class Trie {
    Trie []next=new Trie[26];
    boolean ieEndString=false;
    /** Initialize your data structure here. */
    public Trie() {

    }
    
    /** Inserts a word into the trie. */
    public void insert(String word) {
        char[]arr=word.toCharArray();
        //先取根节点
        Trie root=this;
        for(int i=0;i<arr.length;i++){
            //若根节点没有存储当前遍历字符,则新建一个该字符的Trie树
            if(root.next[arr[i]-'a']==null){
                root.next[arr[i]-'a']=new Trie();
            }
            //将root树移到当前结点的Trie树
            root=root.next[arr[i]-'a'];
        }
        //插入完毕将当前最后一个结点Trie树设置为终止点,表示word插入完毕
        root.ieEndString=true;
    }
    
    /** Returns if the word is in the trie. */
    public boolean search(String word) {
        Trie root=this;
        char[]arr=word.toCharArray();
        for(int i=0;i<arr.length;i++){
        	//如果root中不存在当前遍历字符,则直接返回false,表示未查询到
            if(root.next[arr[i]-'a']==null){
                return false;
            }
            //接着将root树移到当前结点的Trie树
            root=root.next[arr[i]-'a'];
        }
        //只有最后一个字符是终止字符,才算查询到该字符串,意思是所要查询的字符串不能比已有的字符串短
        return root.ieEndString;
    }
    
    /** Returns if there is any word in the trie that starts with the given prefix. */
    public boolean startsWith(String prefix) {
        Trie root=this;
        char[]arr=prefix.toCharArray();
        for(int i=0;i<arr.length;i++){
        	//如果未查询到,直接返回false
            if(root.next[arr[i]-'a']==null){
                return false;
            }
            //接着将root树移到当前结点的Trie树
            root=root.next[arr[i]-'a'];
        }
        //说明prefix是某个已有字符串的前缀
        return true;
    }
}

/**
 * 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);
 */

208. 实现 Trie (前缀树)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值