Design Add and Search Words
Problem
https://leetcode.com/problems/design-add-and-search-words-data-structure/
Design a data structure that supports adding new words and finding if a string matches any previously added string.
Implement the WordDictionary class:
WordDictionary()Initializes the object.void addWord(word)Addswordto the data structure, it can be matched later.bool search(word)Returnstrueif there is any string in the data structure that matcheswordorfalseotherwise.wordmay contain dots'.'where dots can be matched with any letter.
Example:
Input
["WordDictionary","addWord","addWord","addWord","search","search","search","search"]
[[],["bad"],["dad"],["mad"],["pad"],["bad"],[".ad"],["b.."]]
Output
[null,null,null,null,false,true,true,true]
Explanation
WordDictionary wordDictionary = new WordDictionary();
wordDictionary.addWord("bad");
wordDictionary.addWord("dad");
wordDictionary.addWord("mad");
wordDictionary.search("pad"); // return False
wordDictionary.search("bad"); // return True
wordDictionary.search(".ad"); // return True
wordDictionary.search("b.."); // return True
Constraints:
1 <= word.length <= 25wordinaddWordconsists of lowercase English letters.wordinsearchconsist of'.'or lowercase English letters.There will be at most
2dots inwordforsearchqueries.At most
10:sup:`4`calls will be made toaddWordandsearch.
Pattern
String, Depth-First Search, Design, Trie
Approaches
Code
class TrieNode:
def __init__(self, char, end_of_word=False):
self.char = char
self.end_of_word = end_of_word
self.children = {}
class WordDictionary:
def __init__(self):
self.root = TrieNode("<SOW>")
def addWord(self, word: str) -> None:
node = self.root
for char in word:
if char not in node.children:
node.children[char] = TrieNode(char)
node = node.children[char]
node.end_of_word = True
def search(self, word: str) -> bool:
return self._search(self.root, word)
def _search(self, node: TrieNode, word: str) -> bool:
if len(word) == 0:
return node.end_of_word
char = word[0]
if char == ".":
return any(
self._search(child, word[1:])
for child in node.children.values()
)
elif char not in node.children:
return False
else:
return self._search(node.children[char], word[1:])
Test
>>> from design_add_and_search_words_data_structure__trie_with_dfs import WordDictionary
>>> wd = WordDictionary()
>>> wd.addWord("bad"); wd.addWord("dad"); wd.addWord("mad")
>>> wd.search("pad")
False
>>> wd.search("bad")
True
>>> wd.search(".ad")
True
>>> wd.search("b..")
True
- class design_add_and_search_words_data_structure__trie_with_dfs.TrieNode(char, end_of_word=False)
Bases:
object