プレフィックスツリーを生成する方法を、プレフィックスツリーは何ですか?
だから、それは非常に高速になりますとき、文字列が長い文字列配列に表示された回数を探します。文字列の末尾に文字列を配列に表示された回数で表されるカット
:プレフィックスツリープロセスに一つの要素の
英語文字以外の入金したい場合は、しかし、文字、それはポインタの配列を必要としない、とAに従事することができます店をマップ
プレフィックスツリー内で検索:
このようなおおよそコードルックス:
class TrieNode
{
public:
TrieNode()
:pass(0)
, end(0)
{
*next = new TrieNode[26];
}
int pass;
int end;
TrieNode** next = nullptr; //这里真的是太恶心了,找了半天的错误
};
TrieNode* p = nullptr;
class Trie
{
public:
Trie()
:root(new TrieNode()) //先构造一个前缀树的根节点
{}
void Insert(string str) //准备将字符串str插入前缀树
{
if (str.empty())
return;
TrieNode* Node = root; //一个指针指向头结点,开始根据字符串往下遍历
int index = 0;
for (int i = 0; i < str.size(); ++i)
{
index = str[i] - 'a';
//拿到索引值,加入第一个字符是'b',减'a'之后就等于1,
//那么就说明要找root节点中的那个26个指针的数组中的1号索引是否被创建,
//创建了的话就直接沿着创建好的节点走,没有的话就创建
if (Node->next[index] == nullptr) //就代表此时还没有这个结点
{
Node->next[index] = new TrieNode;
}
Node = Node->next[index];//跑到这个结点继续往下找看存不存在接下来元素的节点
Node->pass++;
}
Node->end++;
}
int Search(string str) //查找
{
if (str.empty())
return 0;
TrieNode* Node = root;
int index = 0;
for (int i = 0; i < str.size(); ++i)
{
index = str[i] - 'a';
if (Node->next[index] == nullptr)
return 0;
Node = Node->next[index];
}
return Node->end;
}
void Delete(string str) //删除一个str,假如存在多个str的话,这个函数的功能就是删除一个str
{
if (Search(str) == 0) //如果根本就不存在这个字符串那么久不用删除了
return;
TrieNode* Node = root;
//Node->pass--;
int index = 0;
int i;
for (i = 0; i < str.size(); ++i) //下面这一大坨自己写的,我感觉主要就是因为C++的new出来的内存需要手动释放引起的
{
index = str[i] - 'a';
if (--Node->next[index]->pass == 0)
{
TrieNode* cur = Node->next[index];
Node->next[index] = nullptr;
Node = cur;
i++;
break;
}
}
while (i < str.size())
{
TrieNode* cur = Node->next[index];
delete Node;
Node = cur;
++i;
}
Node->end--;
}
private:
TrieNode* root;
};