题目208:前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。
请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。boolean startsWith(String prefix) 如果之前已经插入的字符串word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。
思路:树状结构,可以直接指向子节点(子节点的值为字母)。我们这里用的是指向一个字典。字典的键是字母,键值是下一级节点。
题目211:请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。
实现词典类 WordDictionary :WordDictionary() 初始化词典对象;void addWord(word) 将 word 添加到数据结构中,之后可以对它进行匹配;bool search(word) 如果数据结构中存在字符串与word 匹配,则返回 true ;否则,返回 false 。word 中可能包含一些 '.' ,每个. 都可以表示任何一个字母。
题目212:给定一个m x n 二维字符网格board 和一个单词列表 words,返回所有二维网格上的单词。
思路:把单词列表上的词汇建立一个前缀树。然后遍历网格,在这棵树上搜索。
题目1268:产品数组product中每个产品都是一个字符串。请你设计一个推荐系统,在依次输入单词searchWord 的每一个字母后,推荐products 数组中前缀与searchWord 相同的最多三个产品。如果前缀相同的可推荐产品超过三个,请按字典序返回最小的三个。
思路:先用产品数组建立一个前缀树。TrieNode isend的属性可以不用,加一个推荐产品的属性。因此在建立前缀树的时候,每个节点都要有自己的推荐产品,如果推荐产品超过三个,就排序后舍弃最后一个。