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

 

posted @ 2019-11-25 16:49  oldby  阅读(164)  评论(0编辑  收藏  举报