트라이는 접두사 나무 또는 트라이 공통 접두어 문자열을 사용하여이 검색 시간을 줄일 수 있습니다. 속도 O (k)는, k는 상기 입력 문자열의 길이이다.
defaultdict를 사용하여 트라이 만들기 (1)
컬렉션 defaultdict를 가져올에서 functools에서 감소 가져 defaultdict (TrieNode) : TrieNode = 람다 클래스 트리는 : 데프 __init __ (자기) : self.trie = TrieNode ()는 데프 (자동, 단어)를 삽입 : (DICT .__ getitem__, 단어 자체를 줄일 수 있습니다. 트라이) '끝'] = TRUE DEF 됨 (자기, 단어) 반환 감소 (람다 D, K : d [K]의 경우 K D를 다른 TrieNode (), 단어 self.trie) 갔지 ( ''말단 거짓)의 데프 startsWith (자기 워드) 복귀 BOOL은 ((람다 D, K 감소 : d [K]를 K 경우에 다른 TrieNode D (), 단어 self.trie) .keys ())
2. 사전 구조를 사용
# 트라이 구조를 정의
클래스 TrieNode (객체) : 데프 __init __ (자기) : "" " 여기 데이터 구조를 초기화합니다. " "" self.data = {} self.is_word이 False = 클래스 트리는 (객체) : 데프 __init __ (자기) : self.root = TrieNode () 데프 (자동, 워드) 삽입 : "" " 트라이에 삽입 단어. : 입력 한 단어 : STR : RTYPE : 무효 " "" 노드 = self.root 단어 문자에 : 아이 = node.data합니다. (편지) 수 :없는 아이의 경우 node.data [편지] = TrieNode () 노드 = node.data [편지] 노드입니다.is_word = TRUE 데프 (자동, 단어를) 검색 : "" " 반환 단어가 트라이에있는 경우. : 입력 한 단어 : STR : RTYPE을 : 부울을 " "" 노드 = self.root 단어 편지에 대한 : 노드 = node.data.get (편지 쓰기) 하지 노드의 경우 : False를 반환 반환 node.is_word 번호를判断单词是否是完整的存在在트라이树中 데프하므로 starts_with (자기, 접두사) : "" " 어떤 단어에있을 경우 반환 트라이 그 주어진 접두사로 시작. : 유형 접두사 : STR : RTYPE : 부울을 """ 노드 = self.root 접두사 문자에 대한 : 노드 = node.data.(편지) 얻을 수 없는 노드의 경우 : False를 반환 반환 참 데프 get_start (자기, 접두사) : "" " 접두어로 시작 반환 단어 : PARAM 접두사 : : 리턴 : 단어 (목록) " "" 데프 _get_key (사전, pre_node) : words_list = [] 의 경우 pre_node.is_word : words_list.append는 (프리) pre_node.data.keys ()에 대한 X : words_list.extend (_get_key (프리 + STR (X) pre_node.data.get (X))) 복귀 words_list의 단어 = [] 하지 self.starts_with (접두사 경우) : 단어를 반환 하는 경우 self.search (접두사) : words.append (접두사) 반환 단어 노드 = self.root 접두사 문자에 대한 : 노드 = node.data.get (편지) 반환 _get_key (접두사, 노드)