题目描述
Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
请你实现 Trie 类:
Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。
示例:
输入
["Trie", "insert", "search", "search", "startsWith", "insert", "search"][[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
输出
[null, null, true, false, true, null, true]
解释
 Trie trie = new Trie();trie.insert("apple");trie.search("apple");   // 返回 Truetrie.search("app");     // 返回 Falsetrie.startsWith("app"); // 返回 Truetrie.insert("app");trie.search("app");     // 返回 True
   复制代码
 代码
 class Trie {    private TrieNode root;
    /** Initialize your data structure here. */    public Trie() {        root = new TrieNode();    }        /** Inserts a word into the trie. */    public void insert(String word) {        TrieNode node = root;        for (char ch : word.toCharArray()) {            if (!node.containsKey(ch)) {                node.put(ch, new TrieNode());            }            node = node.get(ch);        }        node.setEnd();    }        /** Returns if the word is in the trie. */    public boolean search(String word) {        TrieNode node = searchPrefix(word);        return node != null && node.isEnd();    }        /** Returns if there is any word in the trie that starts with the given prefix. */    public boolean startsWith(String prefix) {        TrieNode node = searchPrefix(prefix);        return node != null;    }
    public TrieNode searchPrefix(String prefix) {        TrieNode node = root;        for (char c : prefix.toCharArray()) {            if (node.containsKey(c)) {                node = node.get(c);            } else {                return null;            }        }        return node;    }}
class TrieNode {    private TrieNode[] links;    private final int R = 26;    private boolean isEnd;        public TrieNode () {        links = new TrieNode[R];    }
    public boolean containsKey(char ch) {        return links[ch - 'a'] != null;    }
    public TrieNode get(char ch) {        return links[ch - 'a'];    }
    public void put(char ch, TrieNode node) {        links[ch - 'a'] = node;    }
    public void setEnd() {        isEnd = true;    }
    public boolean isEnd() {        return isEnd;    }}
/** * 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); */
   复制代码
 总结
评论