思路比较简单 只是这种类用的不太习惯。。
插入就是看儿子的这个位置有没有,有就可以给计数加一下,没有就新建节点 插到最后一个字符就设置isend
查找就是一直往下走,如果走不动了就false,否则判断走到最后的isend
判断前缀更简单了,,一直判断就行,都不用判断最后的isend
1 class Trie { 2 private: 3 bool isEnd; //这么写 感觉一个像一个树又像一个节点。。不太习惯啊 4 Trie* next[26]; 5 public: 6 Trie() { 7 isEnd = false; 8 memset(next, 0, sizeof(next)); 9 } 10 11 void insert(string word) { 12 Trie* node = this; 13 for (char c : word) { 14 if (node->next[c-'a'] == NULL) { 15 node->next[c-'a'] = new Trie(); 16 } 17 node = node->next[c-'a']; 18 } 19 node->isEnd = true; 20 } 21 22 bool search(string word) { 23 Trie* node = this; 24 for (char c : word) { 25 node = node->next[c - 'a']; 26 if (node == NULL) { 27 return false; 28 } 29 } 30 return node->isEnd; 31 } 32 33 bool startsWith(string prefix) { 34 Trie* node = this; 35 for (char c : prefix) { 36 node = node->next[c-'a']; 37 if (node == NULL) { 38 return false; 39 } 40 } 41 return true; 42 } 43 };