剑指 Offer II 062. 实现前缀树(208. 实现 Trie (前缀树))

题目:

 

思路:

【1】字典树

代码展示:

//时间37 ms击败34.68%
//内存50 MB击败58.24%
//时间复杂度:初始化为 O(1),其余操作为 O(∣S∣),其中 ∣S∣ 是每次插入或查询的字符串的长度。
//空间复杂度:O(∣T∣⋅Σ),其中 ∣T∣ 为所有插入字符串的长度之和,Σ 为字符集的大小,本题 Σ=26。
class Trie {
    private Trie[] children;
    private boolean isEnd;

    public Trie() {
        //主要是题目限制了都是小写字母,小写字母最多也就26个
        children = new Trie[26];
        //由于字母节点是可以重复利用的,如app和apple,前面三个是重合的,那么怎么判断存在app就靠这个字段
        //当遍历到app的最后一个字母,如果isEnd为true就表示存在app这个字符串
        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;
    }
    
    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 ch = prefix.charAt(i);
            int index = ch - '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);
 */

 

posted @ 2023-07-19 14:28  忧愁的chafry  阅读(16)  评论(0编辑  收藏  举报