Tire 树存储的结构
关于大佬对字典树的解读:【数据结构】字典树TrieTree图文详解
个人想法:
字典树首先需要足够大的空间,是采用空间换时间的一种数据结构。
1. idx :想法优点类似单链表中next指针,通过将p = tire[p][c_temp],可以不断寻找下一个地方。其中tire[p][c_temp]就是不断的存储当时插入字符串时的idx,正是通过idx每个字符才有了自己的地址。
2. tire[N][26] :每个节点下面都有26个子节点,其中tire[p][c_temp] 就是p类似指针,不断的更新,查找到p下面的元素
3.cnt[p]: cnt[p]是代表p指针下有没有完整的字符串。如果为0说明,没有输入恰好到此的字符串。 cnt[p]不一定只为0或1,因为有可能多次输入了同一个单词.
4.p 核心就在于p的一直变换,可以看作为一个指针,不断指向下一个寻址的地址。
208. 实现 Trie (前缀树) - 力扣(LeetCode)
class Trie {
public:
int tire[60000][26]={0},cnt[60000]={0},idx;
Trie() {
idx=0;
}
void insert(string word) {
int p = 0;
for(int i =0;i<word.size();i++){
int c_temp = word[i]-'a';
if(tire[p][c_temp]==0){
tire[p][c_temp] = ++idx;
}
p = tire[p][c_temp];
}
cnt[p]++;
}
bool search(string word) {
int p=0;
for(int i =0;i<word.size();i++){
int c_temp = word[i]-'a';
if(tire[p][c_temp]==0){return false;}
p = tire[p][c_temp];
}
return cnt[p];
}
bool startsWith(string prefix) {
int p = 0;
for(int i =0;i<prefix.size();i++){
int c_temp = prefix[i]-'a';
if(tire[p][c_temp]==0){return false;}
p = tire[p][c_temp];
}
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);
*/