검색 제안 시스템

3161 단어 theabbieleetcodedsa
문자열 배열products과 문자열searchWord이 제공됩니다.
products의 각 문자를 입력한 후 searchWord에서 최대 3개의 제품 이름을 제안하는 시스템을 설계하십시오. 제안된 제품에는 공통 접두사searchWord가 있어야 합니다. 공통 접두사가 있는 제품이 3개 이상 있는 경우 3개의 사전식 최소 제품을 반환합니다.
searchWord의 각 문자를 입력한 후 제안된 제품 목록 목록을 반환합니다.

예 1:

입력: products = ["mobile","mouse","moneypot","monitor","mousepad"], searchWord = "mouse"
출력: [
["모바일","머니팟","모니터"],
["모바일","머니팟","모니터"],
["마우스","마우스패드"],
["마우스","마우스패드"],
["마우스","마우스패드"]
]
설명: 사전순으로 정렬된 제품 = ["모바일","머니팟","모니터","마우스","마우스패드"]
m 및 mo를 입력한 후 모든 제품이 일치하고 사용자 ["mobile","moneypot","monitor"]가 표시됩니다.
mou, mous 및 mouse를 입력하면 시스템에서 ["mouse","mousepad"]를 제안합니다.

예 2:

입력: products = ["havana"], searchWord = "havana"
출력: [["하바나"],["하바나"],["하바나"],["하바나"],["하바나"],["하바나"]]

예 3:

입력: products = ["bags","baggage","banner","box","cloths"], searchWord = "bags"
출력: [["수하물","가방","배너"],["수하물","가방","배너"],["수하물","가방"],["가방"]]

제약:
  • 1 <= products.length <= 1000
  • 1 <= products[i].length <= 3000
  • 1 <= sum(products[i].length) <= 2 * 104
  • products의 모든 문자열은 고유합니다.
  • products[i] 영문 소문자로 구성되어 있습니다.
  • 1 <= searchWord.length <= 1000
  • searchWord 영문 소문자로 구성되어 있습니다.

  • 해결책:

    class Node:
        def __init__(self, val=None, children=[], end=False):
            self.val = val
            self.children = children
            self.end = end
            self.words = set()
    
    class Trie:
        def __init__(self):
            self.root = Node(val=None, children=[])
    
        def insert(self, word: str, pos) -> None:
            n = len(word)
            curr = self.root
            for i, c in enumerate(word):
                found = False
                for node in curr.children:
                    if node.val == c:
                        curr = node
                        curr.words.add(pos)
                        found = True
                        break
                if not found:
                    newcurr = Node(val=c, children=[])
                    newcurr.words.add(pos)
                    curr.children.append(newcurr)
                    curr = newcurr
            curr.end = True
    
        def startsWith(self, prefix: str):
            n = len(prefix)
            curr = self.root
            for i, c in enumerate(prefix):
                found = False
                for node in curr.children:
                    if node.val == c:
                        curr = node
                        found = True
                        break
                if not found:
                    return []
            return curr.words
    
    class Solution:
        def suggestedProducts(self, products: List[str], searchWord: str) -> List[List[str]]:
            trie = Trie()
            for i, p in enumerate(products):
                trie.insert(p, i)
            n = len(searchWord)
            op = []
            for i in range(1, n + 1):
                res = trie.startsWith(searchWord[:i])
                op.append(sorted([products[i] for i in res])[:3])
            return op
    

    좋은 웹페이지 즐겨찾기