208. 实现 Trie (前缀树)

 

labuladong 题解
难度中等

Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。

请你实现 Trie 类:

  • Trie() 初始化前缀树对象。
  • void insert(String word) 向前缀树中插入字符串 word 。
  • boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
  • boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。

 

示例:

输入
["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
[[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
输出
[null, null, true, false, true, null, true]

解释
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple");   // 返回 True
trie.search("app");     // 返回 False
trie.startsWith("app"); // 返回 True
trie.insert("app");
trie.search("app");     // 返回 True


class Trie:

    def __init__(self):
        self.children = [None]*26
        self.is_end = False

    def insert(self, word: str) -> None:
        node = self
        for ch in word:
            ii = ord(ch) - ord('a')
            if node.children[ii] == None:
                node.children[ii] = Trie()
            node = node.children[ii]
        node.is_end = True

    def search(self, word: str) -> bool:
        node = self
        for ch in word:
            ii = ord(ch) - ord('a')
            if node.children[ii] == None:
                return False
            node = node.children[ii]
        return node.is_end

    def startsWith(self, prefix: str) -> bool:
        node = self
        for ch in prefix:
            ii = ord(ch) - ord('a')
            if node.children[ii] == None:
                return False
            node = node.children[ii]
        return True


# Your Trie object will be instantiated and called as such:
# obj = Trie()
# obj.insert(word)
# param_2 = obj.search(word)
# param_3 = obj.startsWith(prefix)

 



 1 class Trie {
 2     std::vector<Trie*> children;
 3     bool is_end;
 4 public:
 5     Trie() {
 6         is_end = false;
 7         children = std::vector<Trie*>(26);
 8     }
 9     
10     void insert(string word) {
11         Trie* node = this;
12         for(auto ch : word) {
13             if (node->children[ch-'a'] == nullptr) {
14                 node->children[ch-'a'] = new Trie();
15             }
16             node = node->children[ch-'a'];
17         }
18         node->is_end = true;
19     }
20     
21     bool search(string word) {
22         Trie* node = this;
23         for(auto ch : word) {
24             if (node->children[ch - 'a'] == nullptr) {
25                 return false;
26             }
27             node = node->children[ch-'a'];
28         }
29         return node->is_end;
30     }
31     
32     bool startsWith(string prefix) {
33         Trie* node = this;
34         for(auto ch : prefix) {
35             if (node->children[ch - 'a'] == nullptr) {
36                 return false;
37             }
38             node = node->children[ch - 'a'];
39         }
40         return true;
41     }
42 };
43 
44 /**
45  * Your Trie object will be instantiated and called as such:
46  * Trie* obj = new Trie();
47  * obj->insert(word);
48  * bool param_2 = obj->search(word);
49  * bool param_3 = obj->startsWith(prefix);
50  */

 

posted @ 2022-05-31 22:27  乐乐章  阅读(29)  评论(0编辑  收藏  举报