mirror of
https://github.com/prdlk/leetcode.git
synced 2026-11-02 13:12:44 +00:00
feat(work): add solution for LeetCode 211 design add and search words data structure
This commit is contained in:
1 parent
61dc19fb29
commit
204e178fa4
1 file changed
+101
@@ -0,0 +1,101 @@
|
|||||||
|
"""
|
||||||
|
211. Design Add and Search Words Data Structure
|
||||||
|
Difficulty: Medium
|
||||||
|
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) Adds word to the data structure, it can be
|
||||||
|
matched later.
|
||||||
|
|
||||||
|
• bool search(word) Returns true if there is any string in the data
|
||||||
|
structure that matches word or false otherwise. word may 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 <= 25
|
||||||
|
|
||||||
|
• word in addWord consists of lowercase English letters.
|
||||||
|
|
||||||
|
• word in search consist of '.' or lowercase English letters.
|
||||||
|
|
||||||
|
• There will be at most 2 dots in word for search queries.
|
||||||
|
|
||||||
|
• At most 10^4 calls will be made to addWord and search.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class TrieNode:
|
||||||
|
def __init__(self):
|
||||||
|
self.children = {}
|
||||||
|
self.endOfWord = False
|
||||||
|
|
||||||
|
|
||||||
|
class WordDictionary:
|
||||||
|
def __init__(self):
|
||||||
|
self.root = TrieNode()
|
||||||
|
|
||||||
|
def addWord(self, word: str) -> None:
|
||||||
|
cur = self.root
|
||||||
|
for c in word:
|
||||||
|
if c not in cur.children:
|
||||||
|
cur.children[c] = TrieNode()
|
||||||
|
cur = cur.children[c]
|
||||||
|
cur.endOfWord = True
|
||||||
|
|
||||||
|
# Leverage Recursion
|
||||||
|
def search(self, word: str) -> bool:
|
||||||
|
def dfs(j, root):
|
||||||
|
cur = root
|
||||||
|
for i in range(j, len(word)):
|
||||||
|
c = word[i]
|
||||||
|
|
||||||
|
if c == ".":
|
||||||
|
for child in cur.children.values():
|
||||||
|
if dfs(i + 1, child):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if c not in cur.children:
|
||||||
|
return False
|
||||||
|
cur = cur.children[c]
|
||||||
|
return cur.endOfWord
|
||||||
|
|
||||||
|
return dfs(0, self.root)
|
||||||
|
|
||||||
|
|
||||||
|
# Your WordDictionary object will be instantiated and called as such:
|
||||||
|
# obj = WordDictionary()
|
||||||
|
# obj.addWord(word)
|
||||||
|
# param_2 = obj.search(word)
|
||||||
Reference in new issue
Block a user