leetcode-164周赛-1268-搜索推荐系统
题目描述:
自己的提交:
class Solution: def suggestedProducts(self, products: List[str], searchWord: str) -> List[List[str]]: products.sort() res = [] for i in range(1,len(searchWord)+1): ans = [] k = 3 for p in products: if len(p) >= i and p[:i] == searchWord[:i]: ans.append(p) k -= 1 if k == 0: break res.append(ans) return res
优化:
class Solution: def suggestedProducts(self, products: List[str], searchWord: str) -> List[List[str]]: products.sort() search = "" pos, n = 0, len(products) ans = list() for ch in searchWord: search += ch while pos < n and products[pos] < search: pos += 1 result = list() for i in range(3): if pos + i < n and products[pos + i].startswith(search): result.append(products[pos + i]) else: break ans.append(result) return ans
另:
class Solution: def suggestedProducts(self, products: List[str], searchWord: str) -> List[List[str]]: products.sort() N = len(searchWord) Ans = [] for i in range(N): cnt = 0 M = len(products) new_products = [] for j in range(M): v = products[j] l = len(v) if l >= i+1 and v[i] == searchWord[i]: new_products.append(v) Ans.append(new_products[:3]) products = new_products return Ans
方法二:前缀树
def make_trie(root, word): node = root for c in word: node.words.append(word) print(node.words) if not c in node.mp: node.mp[c] = Node() node = node.mp[c] node.words.append(word) class Solution(object): def suggestedProducts(self, products, searchWord): """ :type products: List[str] :type searchWord: str :rtype: List[List[str]] """ root = Node() for word in products: make_trie(root, word) ans = [] for c in searchWord: if root is None or (not c in root.mp): root = None else: root = root.mp[c] if root is None: ans.append([]) else: ret = sorted(root.words) if len(ret) > 3: ret = ret[:3] ans.append(ret) return ans