//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"); // 返回 True//trie.search("app"); // 返回 False//trie.startsWith("app"); // 返回 True//trie.insert("app");//trie.search("app"); // 返回 True////////// 提示:////// 1 <= word.length, prefix.length <= 2000// word 和 prefix 仅由小写英文字母组成// insert、search 和 startsWith 调用次数 总计 不超过 3 * 104 次//// Related Topics 设计 字典树// 👍 639 👎 0
字典树用来快速判断字符集固定的字符范围挺实用,是一道模板题
class Trie {class Node{char ch;// 标志下一层节点,初始都为nullNode[] next = new Node[26];// 是否有单词结束在该节点boolean end = false;}Node root;/** Initialize your data structure here. */public Trie() {root = new Node();}/** Inserts a word into the trie. */public void insert(String word) {Node cur = root;for (int i = 0; i < word.length(); i++) {char ch = word.charAt(i);// 如果下一个节点是空,就新建一个节点if (cur.next[ch - 'a'] == null) {cur.next[ch - 'a'] = new Node();cur.next[ch - 'a'].ch = ch;}// 将cur指针指向下一个节点cur = cur.next[ch - 'a'];}// 单词结束在cur节点上,将end置为truecur.end = true;}/** Returns if the word is in the trie. */public boolean search(String word) {Node cur = root;for (int i = 0; i < word.length(); i++) {char ch = word.charAt(i);// 如果下一个节点为null,直接返回false,说明没有添加过这个字符串if (cur.next[ch - 'a'] == null) {return false;}cur = cur.next[ch - 'a'];}// 比如添加了apple, 搜索app的时候,需要判读是否该节点有结束的字符串return cur.end;}/** Returns if there is any word in the trie that starts with the given prefix. */public boolean startsWith(String prefix) {Node cur = root;for (int i = 0; i < prefix.length(); i++) {char ch = prefix.charAt(i);if (cur.next[ch - 'a'] == null) {return false;}cur = cur.next[ch - 'a'];}// 只找前缀就不用判断是否有结束了return true;}}
