Note:
构建一个26叉树
节点不代表值,边代表值,光一个根节点代表空串
每个节点分出来26条边,代表a ~ z
插入操作,每次插入的时候,如果当前字符对应的边不存在,就创建一条,如果存在就往下走
走到最后了,打一个标记,记录一下这是一个结束,意味着到这了就是一个存的单词了
查询操作,就是按着边往下走,走不动了就是不存在,走到最后没有结束标记也是查询失败
题里的另一个查询:
往下走,中间断了就说明查找失败,如果能走到最后就说明存放的已经有这个前缀了,返回true即可
代码如下:
class Trie {
public:
struct Node{
Node* son[26];
bool is_end;
Node(){
for(int i = 0; i < 26; i ++)
son[i] = NULL;
is_end = false;
}
}*root;
Trie() {
root = new Node();
}
void insert(string word) {
auto p = root;
for(int i = 0; i < word.size(); i ++){
int c = word[i] - 'a';
if(!p -> son[c]) p -> son[c] = new Node();
p = p -> son[c];
}
p -> is_end = true;
}
bool search(string word) {
auto p = root;
for(auto c : word){
int n = c - 'a';
if(!p -> son[n]) return false;
p = p -> son[n];
}
return p -> is_end;
}
bool startsWith(string prefix) {
auto p = root;
for(auto c : prefix){
int n = c - 'a';
if(!p -> son[n]) return false;
p = p -> son[n];
}
return true;
}
};
/**
* Your Trie object will be instantiated and called as such:
* Trie* obj = new Trie();
* obj->insert(word);
* bool param_2 = obj->search(word);
* bool param_3 = obj->startsWith(prefix);
*/