# 208. Implement Trie (Prefix Tree) 題目:<https://leetcode.com/problems/implement-trie-prefix-tree/> 解法:實作字典樹 Python3: ``` python 3 class Trie: def __init__(self): self.children = dict() self.isWord = False def insert(self, word: str) -> None: cur = self for c in word: if c not in cur.children: cur.children[c] = Trie() cur = cur.children[c] cur.isWord = True def search(self, word: str) -> bool: cur = self for c in word: if c not in cur.children: return False cur = cur.children[c] return cur.isWord def startsWith(self, prefix: str) -> bool: cur = self for c in prefix: if c not in cur.children: return False cur = cur.children[c] return True if __name__ == '__main__': obj = Trie() obj.insert('apple') result = obj.search('apple') print(result) # return True result = obj.search('app') print(result) # return False result = obj.startsWith('app') print(result) # return True obj.insert('app') result = obj.search('app') print(result) # return True ``` C: ``` c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> typedef struct Trie{ struct Trie* children[26]; bool isWord; } Trie; Trie* trieCreate() { Trie* obj = (Trie*)malloc(sizeof(Trie)); for (int i = 0; i < 26; i++) obj->children[i] = NULL; obj->isWord = false; return obj; } void trieInsert(Trie* obj, char * word) { Trie* cur = obj; for (int i = 0; i < strlen(word); i++) { int idx = word[i]-'a'; if (cur->children[idx] == NULL) cur->children[idx] = trieCreate(); cur = cur->children[idx]; } cur->isWord = true; } bool trieSearch(Trie* obj, char * word) { Trie* cur = obj; for (int i = 0; i < strlen(word); i++) { int idx = word[i]-'a'; if (cur->children[idx] == NULL) return false; cur = cur->children[idx]; } return cur->isWord; } bool trieStartsWith(Trie* obj, char * prefix) { Trie* cur = obj; for (int i = 0; i < strlen(prefix); i++) { int idx = prefix[i]-'a'; if (cur->children[idx] == NULL) return false; cur = cur->children[idx]; } return true; } void trieFree(Trie* obj) { for (int i = 0; i < 26; i++) if (obj->children[i] != NULL) trieFree(obj->children[i]); free(obj); } int main() { bool result; Trie* obj = trieCreate(); trieInsert(obj, "apple"); result = trieSearch(obj, "apple"); printf("%s\n", result ? "True" : "False"); // return True result = trieSearch(obj, "app"); printf("%s\n", result ? "True" : "False"); // return False result = trieStartsWith(obj, "app"); printf("%s\n", result ? "True" : "False"); // return True trieInsert(obj, "app"); result = trieSearch(obj, "app"); printf("%s\n", result ? "True" : "False"); // return True trieFree(obj); } ``` ###### tags: `leetcode` `trie`