1268-search-suggestions-system¶
Try it on leetcode
Description¶
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"]]
Example 3:
Input: products = ["bags","baggage","banner","box","cloths"], searchWord = "bags" Output: [["baggage","bags","banner"],["baggage","bags","banner"],["baggage","bags"],["bags"]]
Constraints:
1 <= products.length <= 1000
1 <= products[i].length <= 3000
1 <= sum(products[i].length) <= 2 * 104
- All the strings of
products
are unique. products[i]
consists of lowercase English letters.1 <= searchWord.length <= 1000
searchWord
consists of lowercase English letters.
Solution(Python)¶
class Solution:
def suggestedProducts(
self, products: List[str], searchWord: str
) -> List[List[str]]:
return self.trie_search(products, searchWord)
# Time complexity: O(n log n+nm)
# Space complexity: O(n)
def bruteforce(self, products: List[str], searchWord: str) -> List[List[str]]:
products.sort()
res = []
for i in range(len(searchWord)):
cur = []
prefix = searchWord[: i + 1]
for i in range(len(products)):
if prefix in products[i]:
cur = products[i: i + 3]
break
res.append(cur)
return res
# Time complexity: O(n log n+mlogn)
# Space complexity: O(n)
def binarysearch(self, products: List[str], searchWord: str) -> List[List[str]]:
products.sort()
res = []
prefix = ""
for i in range(len(searchWord)):
prefix += searchWord[i]
start = bisect_left(products, prefix)
cur = [
products[j]
for j in range(start, len(products))
if j < start + 3 and prefix in products[j]
]
res.append(cur)
return res
# Time complexity: O(nlogn +nm+s)
# Space complexity: O(nkm)
def trie_search(self, products: List[str], searchWord: str) -> List[List[str]]:
class TrieNode:
def __init__(self):
self.children = collections.defaultdict(TrieNode)
self.suggestion = []
def add_suggestion(self, product):
if len(self.suggestion) < 3:
self.suggestion.append(product)
products = sorted(products)
root = TrieNode()
for product in products:
node = root
for c in product:
node = node.children[c]
node.add_suggestion(product)
res, node = [], root
for c in searchWord:
node = node.children[c]
res.append(node.suggestion)
return res