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