2022-4-7 高频面试题
Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
请你实现 Trie 类:
Trie()
初始化前缀树对象。void insert(String word)
向前缀树中插入字符串word
。boolean search(String word)
如果字符串word
在前缀树中,返回true
(即,在检索之前已经插入);否则,返回false
。boolean startsWith(String prefix)
如果之前已经插入的字符串word
的前缀之一为prefix
,返回true
;否则,返回false
。
1 class Trie { 2 3 private Node root; 4 5 class Node{ 6 boolean isWord; 7 TreeMap<Character,Node> next; 8 Node(){ 9 this.isWord=false; 10 this.next=new TreeMap<>(); 11 } 12 } 13 14 15 public Trie() { 16 root=new Node(); 17 } 18 19 public void insert(String word) { 20 Node cur=root; 21 for (int i=0;i<word.length();i++) { 22 char c=word.charAt(i); 23 if (cur.next.get(c)==null) { 24 cur.next.put(c,new Node()); 25 } 26 cur=cur.next.get(c); 27 } 28 cur.isWord=true; 29 } 30 31 public boolean search(String word) { 32 Node cur=root; 33 for (int i=0;i<word.length();i++) { 34 char c=word.charAt(i); 35 if (cur.next.get(c)==null) return false; 36 else cur=cur.next.get(c); 37 } 38 return cur.isWord; 39 } 40 41 public boolean startsWith(String prefix) { 42 Node cur=root; 43 for (int i=0;i<prefix.length();i++) { 44 char c=prefix.charAt(i); 45 if (cur.next.get(c)==null) return false; 46 else cur=cur.next.get(c); 47 } 48 return cur.next!=null; 49 } 50 } 51 52 53 /** 54 * Your Trie object will be instantiated and called as such: 55 * Trie obj = new Trie(); 56 * obj.insert(word); 57 * boolean param_2 = obj.search(word); 58 * boolean param_3 = obj.startsWith(prefix); 59 */
思路:可以只开26个数组来实现。也可以根节点加映射实现。