力扣208. 实现 Trie (前缀树)
2024-01-07 22:46:25
字典树
- 思路:
- 定义
- 使用子节点数据结构使用一个26叉数组分别对应 a-z;
- 使用 isEnd 标记是否为字符串结尾;
- 插入:
- 子节点存在,将指针移动子节点,继续处理下一个字符;
- 如果子节点不存在,则创建节点记录在?children?数组的对应位置上,然后沿着指针移动到子节点,继续搜索下一个字符;
- 重复以上步骤,直到处理字符串的最后一个字符,然后将当前节点标记为字符串的结尾;
- 查找前缀:
- 子节点存在,沿着指针移动到子节点,继续搜索下一个字符;
- 子节点不存在,说明字典树中不包含该前缀,返回空指针;
- 定义
class Trie {
public:
Trie() :
children(26),
isEnd(false) {
}
void insert(string word) {
Trie* node = this;
for (char ch : word) {
ch -= 'a';
if (node->children[ch] == nullptr) {
node->children[ch] = new Trie();
}
node = node->children[ch];
}
node->isEnd = true;
}
bool search(string word) {
Trie* node = searchPrefix(word);
return node != nullptr && node->isEnd;
}
bool startsWith(string prefix) {
return searchPrefix(prefix) != nullptr;
}
private:
Trie* searchPrefix(std::string prefix) {
Trie* node = this;
for (char ch : prefix) {
ch -= 'a';
if (node->children[ch] == nullptr) {
return nullptr;
}
node = node->children[ch];
}
return node;
}
private:
std::vector<Trie*> children;
bool isEnd;
};
/**
* 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);
*/
- 关于字典树将会有专栏基于开源库进一步研究,敬请期待 ... ...
文章来源:https://blog.csdn.net/N_BenBird/article/details/135430963
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!