Trie That prefix tree or trie , using the common prefix string reduce search time. Speed is O (k), k is the length of the input string.
1. Create a trie using defaultdict
from collections import defaultdict from functools import reduce TrieNode = lambda: defaultdict(TrieNode) class Trie: def __init__(self): self.trie = TrieNode() def insert(self, word): reduce(dict.__getitem__, word, self.trie)['end'] = True def search(self, word): return reduce(lambda d,k: d[k] if k in d else TrieNode(), word, self.trie).get('end', False) def startsWith(self, word): return bool(reduce(lambda d,k: d[k] if k in d else TrieNode(), word, self.trie).keys())
2. Using dictionary structure
# Define trie structure
class TrieNode(object): def __init__(self): """ Initialize your data structure here. """ self.data = {} self.is_word = False class Trie(object): def __init__(self): self.root = TrieNode() def insert(self, word): """ Inserts a word into the trie. :type word: str :rtype: void """ node = self.root for letter in word: child = node.data.get(letter) if not child: node.data[letter] = TrieNode() node = node.data[letter] node.is_word = True def search(self, word): """ Returns if the word is in the trie. :type word: str :rtype: bool """ node = self.root for letter in word: node = node.data.get(letter) if not node: return False Return node.is_word # judge whether the word is complete in the presence of trie tree def starts_with(self, prefix): """ Returns if there is any word in the trie that starts with the given prefix. :type prefix: str :rtype: bool """ node = self.root for letter in prefix: node = node.data.get(letter) if not node: return False return True def get_start(self, prefix): """ Returns words started with prefix :param prefix: :return: words (list) """ def _get_key(pre, pre_node): words_list = [] if pre_node.is_word: words_list.append(pre) for x in pre_node.data.keys(): words_list.extend(_get_key(pre + str(x), pre_node.data.get(x))) return words_list words = [] if not self.starts_with(prefix): return words if self.search(prefix): words.append(prefix) return words node = self.root for letter in prefix: node = node.data.get(letter) return _get_key(prefix, node)