mirror of
https://github.com/prdlk/leetcode.git
synced 2026-11-02 21:22:43 +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
6d87e1dfc4
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