1268. Search Suggestions System
You are given an array of strings products
and a string searchWord
.
Design a system that suggests at most three product names from products
after each character of searchWord
is typed. Suggested products should have common prefix with searchWord
. If there are more than three products with a common prefix return the three lexicographically minimums products.
Return a list of lists of the suggested products after each character of searchWord
is typed.
Example 1:
Input: products = ["mobile","mouse","moneypot","monitor","mousepad"], searchWord = "mouse"
Output: [["mobile","moneypot","monitor"],["mobile","moneypot","monitor"],["mouse","mousepad"],["mouse","mousepad"],["mouse","mousepad"]]
Explanation: products sorted lexicographically = ["mobile","moneypot","monitor","mouse","mousepad"].
After typing m and mo all products match and we show user ["mobile","moneypot","monitor"].
After typing mou, mous and mouse the system suggests ["mouse","mousepad"].
Example 2:
Input: products = ["havana"], searchWord = "havana"
Output: [["havana"],["havana"],["havana"],["havana"],["havana"],["havana"]]
Explanation: The only word "havana" will be always suggested while typing the search word.
Constraints:
1 <= products.length <= 1000
1 <= products[i].length <= 3000
1 <= sum(products[i].length) <= 2 * 10^4
products
are unique.products[i]
consists of lowercase English letters.1 <= searchWord.length <= 1000
searchWord
consists of lowercase English letters.class TrieNode:
def __init__(self):
self.children = dict()
self.is_word = False
self.word = ""
class Trie:
def __init__(self):
self.root = TrieNode()
def add(self, word):
curr = self.root
for c in word:
if c not in curr.children:
curr.children[c] = TrieNode()
curr = curr.children[c]
curr.word = word
curr.is_word = True
def search(self, word):
answer = []
curr = self.root
for i in range(len(word)):
if word[i] not in curr.children:
for _ in range(len(word)-i):
answer.append([])
return answer
curr = curr.children[word[i]]
answer.append(self.bfs(curr))
return answer
def bfs(self, curr):
q = collections.deque([curr])
result = []
while q:
curr = q.popleft()
if curr.is_word:
result.append(curr.word)
for i in curr.children.values():
q.append(i)
return sorted(result)[:3]
class Solution:
def suggestedProducts(self, products: List[str], searchWord: str) -> List[List[str]]:
trie = Trie()
for product in products:
trie.add(product)
return trie.search(searchWord)