C++实现前缀树(字典树) 可以用来处理查找字符串问题 例如:10w屏蔽词 替换用户违法词语成**
2021/9/27 14:10:56
本文主要是介绍C++实现前缀树(字典树) 可以用来处理查找字符串问题 例如:10w屏蔽词 替换用户违法词语成**,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
大佬写的前缀树详解:https://zhuanlan.zhihu.com/p/28891541
C++实现
#include <iostream> #include<string> #include<vector> using namespace std; class TrieNode{ public: int count;//以当前单词结尾的单词数量 int prefix;//以该节点之前的字符串为前缀的单词数量 vector<TrieNode*>nextNode; TrieNode() { nextNode.resize(26, nullptr); count = 0; prefix = 0; } }; //根据字符串插入节点 void insert(TrieNode* root, string str) { if (root == nullptr || str.size() == 0) { return; } for (int i = 0; i < str.size(); i++) { if (root->nextNode[str[i] - 'a'] == nullptr) { root->nextNode[str[i] - 'a'] = new TrieNode(); } root = root->nextNode[str[i] - 'a']; root->prefix++; } root->count++; } //查找单词是否存在 存在返回数量 不存在返回-1 int search(TrieNode* root, string str) { if (root == nullptr || str.size() == 0) { return false; } for (int i = 0; i < str.size(); i++) { if (root->nextNode[str[i] - 'a'] == nullptr) { return false; } root = root->nextNode[str[i] - 'a']; } if (root->count == 0) { //有可能只是前缀 所以count==0, return -1; } return root->count; } //查找以str为前缀的单词数量 int searchPrefix(TrieNode* root, string str) { if (root == nullptr || str.size() == 0) { return 0; } for (int i = 0; i < str.size(); i++) { if (root->nextNode[str[i] - 'a'] == nullptr) { return 0; } root = root->nextNode[str[i] - 'a']; } return root->prefix; } int main() { TrieNode* newNode = new TrieNode(); insert(newNode, "hello"); insert(newNode, "hello"); insert(newNode, "hello"); insert(newNode, "helloworld"); cout << search(newNode, "hello") << endl; cout << search(newNode, "hellowo") << endl; cout << search(newNode, "he") << endl; cout << searchPrefix(newNode, "he") << endl; cout << searchPrefix(newNode, "hellow") << endl; return 0; }
这篇关于C++实现前缀树(字典树) 可以用来处理查找字符串问题 例如:10w屏蔽词 替换用户违法词语成**的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享