leetcode——字典树(Trie树)的实现

2019-10-16  本文已影响0人  李die喋

leetcode——实现Trie(前缀树)

题目

实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。

示例

Trie trie = new Trie();

trie.insert("apple");
trie.search("apple");   // 返回 true
trie.search("app");     // 返回 false
trie.startsWith("app"); // 返回 true
trie.insert("app");   
trie.search("app");     // 返回 true

看到这个题一点思路都没有,前缀树是什么。就去查了一下概念什么是前缀树。发现前缀树通常被用来查找字符串的公共前缀,是通过空间换取时间的一种方法。一般创建前缀树结点的时候里面都有两个变量,一个布尔变量isTrie和一个结点数据,长度为26,他们的下标代表当前字符串中的字符存在。

给出一组单词,inn,int,at,age,adv,ant,可以得到下面的Trie:

image

每条边上的字母代表上一个结点中的children数组中对应的位置new出的新的结点。每个结点对应一项前缀。叶结点对应最长前缀,即单词本身。可以通过这种方式判断公共前缀。

下面来看这道题怎么写:

class Trie{
    public TrieNode root;
    public Trie(){
        root = new TrieNode();
    }
    
    //创建字典树
    public void insert(String s){
        TrieNode node = this.root;
        for(char ch : s.toCharArray()){
            if(node.children[ch - 'a'] == null){
                node.children[ch-'a'] = new TrieNode();
            }
            node = node.children[ch-'a'];
        }
        node.val = s;
    }
    //在字典树中查找是否包含当前单词
    public boolean search(String s){
        TrieNode node = this.root;
        for(char ch : s.toCharArray()){
            if(node.children[ch-'a'] != null) {
                return false;
            }
            node = node.children[ch-'a'];
        }
        return node.val.equals(s);
    }
    //查找是否包含前缀
    public boolean startWith(String s){
        TrieNode node = this.root;
        for(char ch : s.toCharArray()){
            if(node.children[ch-'a'] == null){
                return false;
            }
            node = node.children[ch-'a'];
        }
        return true;
    }
    
    //创建字典树结点结构 26代表26个字母,根据不同的字母创建结点
    class TrieNode{
        TrieNode[] children = new TrieNode[26];
        String val;
    }
}

还是要多刷算法,加油!!!

上一篇下一篇

猜你喜欢

热点阅读