211. 添加与搜索单词 - 数据结构设计
1. 题目
请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。
实现词典类 WordDictionary :
WordDictionary()初始化词典对象void addWord(word)将word添加到数据结构中,之后可以对它进行匹配bool search(word)如果数据结构中存在字符串与word匹配,则返回true;否则,返回false。word中可能包含一些'.',每个.都可以表示任何一个字母。
示例:
1 | 输入: |
提示:
1 <= word.length <= 25addWord中的word由小写英文字母组成search中的word由 ‘.’ 或小写英文字母组成- 最多调用
10^4次addWord和search
2. 思路
- 整体思路同208. 实现Tire(前缀树)一致,均采用的
TireTree结构,其中类元素包括一个TireTree数组,数组长度为题目提示中说明的字符集长度26(均为小写字母)和一个字符串结尾标识isFinal,默认为false - 需要注意的是本题的查询方法包含了特殊字符
.,表示该字符可以兼容任意字母,考虑到该特点,需要在查询的过程中引入深度查询算法 - 搜索过程中,如果遇到的字符不为
.,则判断当前节点的children中对应下标的节点(也称为下一个节点)是否为空,如果为空,则表示前缀树无法形成完整的单词,因此可以直接返回false - 如果遇到的字符为
.,考虑到字符.可以代表任意字符,则需要遍历所有的children节点,并基于每个存在节点,深入判断是否能够形成搜索的单词 - 将搜索方法抽取为
search(char[] arr, TireTree node, int startIndex)用于支持深度递归搜索
3. 代码
1 | class WordDictionary { |
4. 复杂度
- 时间复杂度: 添加单词的时间复杂度为
O(L),查询操作的时间复杂度为O(26^L),其中L为字符串长度, - 空间复杂度: 为所有添加了单词的字符串长度 * 26
