原题
设计一个包含下面两个操作的数据结构:addWord(word), search(word)
addWord(word)会在数据结构中添加一个单词。而search(word)则支持普通的单词查询或是只包含. 和a-z的简易正则表达式的查询。一个 . 可以代表一个任何的字母。
样例
addWord("bad")
addWord("dad")
addWord("mad")
search("pad") // return false
search("bad") // return true
search(".ad") // return true
search("b..") // return true
解题思路
- 本题跟Implement Trie十分相似,同样需要使用字典树
- 由于本题里中'.'可以代替任意字符,所以当某一个字符是'.',就需要查找所有的子树,只要有一个最终能够存在,就返回True
完整代码
class TrieNode(object):
def __init__(self):
"""
Initialize your data structure here.
"""
self.children = {}
self.IsWord = False
class WordDictionary(object):
def __init__(self):
"""
initialize your data structure here.
"""
self.root = TrieNode()
def addWord(self, word):
"""
Adds a word into the data structure.
:type word: str
:rtype: void
"""
node = self.root
for letter in word:
child = node.children.get(letter)
if child is None:
child = TrieNode()
node.children[letter] = child
node = child
node.IsWord = True
def search(self, word):
"""
Returns if the word is in the data structure. A word could
contain the dot character '.' to represent any one letter.
:type word: str
:rtype: bool
"""
return self.find(self.root, word)
def find(self, node, word):
if word == "":
return node.IsWord
if word[0] == ".":
for x in node.children:
if self.find(node.children[x], word[1:]):
return True
else:
child = node.children.get(word[0])
if child:
return self.find(child, word[1:])
return False