211. 添加与搜索单词 - 数据结构设计
1. 题目
请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。
实现词典类 WordDictionary
:
WordDictionary()
初始化词典对象void addWord(word)
将word
添加到数据结构中,之后可以对它进行匹配bool search(word)
如果数据结构中存在字符串与word
匹配,则返回true
;否则,返回false
。word
中可能包含一些'.'
,每个.
都可以表示任何一个字母。
示例:
1 | 输入: |
提示:
1 <= word.length <= 25
addWord
中的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