208 Implement Trie

https://leetcode.com/problems/implement-trie-prefix-tree/

solution

  • 根节点不包含字符,除根节点外每一个节点都只包含一个字符

  • 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串

  • 每个节点的所有子节点包含的字符都不相同

class Trie:
    def __init__(self):
        self.root = {}  # 多重字典实现多叉树, 字典的value是另一个字典, 这个字典的多个key是下一层

    def insert(self, word: str) -> None:
        cur = self.root  # cur类似在多重字典中的list指针

        for letter in word:
            if letter not in cur:
                cur[letter] = {}
            cur = cur[letter]  # 关键在于理解这里
        cur['*'] = ''  # 结束标志

    def search(self, word: str) -> bool:
        cur = self.root
        for letter in word:
            if letter not in cur:
                return False
            cur = cur[letter]
        return '*' in cur

    def startsWith(self, prefix: str) -> bool:
        cur = self.root
        for letter in prefix:
            if letter not in cur:
                return False
            cur = cur[letter]
        return True

时间复杂度:O(l) 空间复杂度:O()

class TrieNode(object):
    def __init__(self):
        self.children: Dict[str, TrieNode] = {}
        self.is_word = False

class Trie:
    def __init__(self):
        self.root = TrieNode()

    def insert(self, word):
        node = self.root
        for char in word:
            # set_default: 查找key, 如果存在, 返回对应值; 如果不存在,则在字典中添加key,并将值设置为指定值
            node = node.children.setdefault(char, TrieNode())
        node.is_word = True

    def search(self, word):
        node = self.root
        for char in word:
            if char not in node.children:
                return False
            node = node.children[char]
        return node.is_word

    def startsWith(self, prefix):
        node = self.root
        for char in prefix:
            node = node.children.get(char)
            if not node:
                return False
        return True

    def get_start(self, prefix):
        def get_key(pre, pre_node):
            word_list = []
            if pre_node.is_word:
                word_list.append(pre)
            for x in pre_node.children.keys():
                word_list.extend(get_key(pre + str(x), pre_node.children.get(x)))
            return word_list

        words = []
        if not self.startsWith(prefix):
            return words
        if self.search(prefix):
            words.append(prefix)
            return words
        node = self.root
        for char in prefix:
            node = node.children.get(char)
        return get_key(prefix, node)

Last updated