835. Trie字符串统计
2022/9/17 23:18:35
本文主要是介绍835. Trie字符串统计,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
这个问题在于理解son这个数组,首先字典树可以理解为一层一层的,
首先,为什么是son[N][26]最长长度的字符串有N个字母,每个字母有26种可能所以就是这样。(其实一共字符串比如abc,可以算三种情况, a, ab, abc。)
比如这个:
son[0]就理解为第一层,也就是字符串第一个字符,对应字符串的第一个字母的26个可能的字母,所以有26个位置,字符串第二个字母就是son[1],也有26种可能,
而son[0][0],假如第一个加入的字符串abc第一个字母为a这个son[0][0]这一项就等于1,然后son[1][1]等于2,son[2][2]等于3,(这里的 1 2 3 就是idx(idx就是第几种情况))
(100000个字符串所以有100000种情况,son[][]对应的值就是每一项对应结尾的序号,此时cnt[son[][]]++)
第二个字符串abd就 a和b都已经出现过了所以一直到
第三个字母son[2][3]等于4,表示此前的字符串都不符合当前这个情况,出现的第四种情况。
#include<bits/stdc++.h> using namespace std; const int N = 100010; int son[N][26], cnt[N], idx; char str[N]; void insert(char str[]) { int p = 0; //类似指针,指向当前节点 for(int i = 0; str[i]; i++) { int u = str[i] - 'a'; //将字母转化为数字 if(!son[p][u]) son[p][u] = ++idx; //该节点不存在,创建节点,其值为下一个节点位置 p = son[p][u]; //使“p指针”指向下一个节点位置 } cnt[p] ++ ; } int query(char str[]) { int p = 0; for (int i = 0; str[i]; i++) { int u = str[i] - 'a'; if(!son[p][u]) return 0; p = son[p][u]; } return cnt[p]; } int main() { int n; scanf("%d", &n); while(n --) { char op[2]; scanf("%s%s", op, str); if(op[0] == 'I') insert(str); else printf("%d\n", query(str)); } }
这篇关于835. Trie字符串统计的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-04-17基于SpringWeb MultipartFile文件上传、下载功能
- 2024-04-14个人开发者,Spring Boot 项目如何部署
- 2024-04-14RAG应用开发实战02-相似性检索的关键 - Embedding
- 2024-04-14出海软件草根逆袭打法是什么?
- 2024-04-13鸿蒙原生应用再新丁!企查查 碧蓝航线 入局鸿蒙
- 2024-04-11RAG应用开发实战(01)-RAG应用框架和解析器
- 2024-04-10DevOps已死?2024年的DevOps将如何发展
- 2024-04-10码农必看:常见源代码混淆技术详解
- 2024-04-07以一当十丨TiDB 在东吴证券秀财 APP 的应用实践
- 2024-04-07月活超 1.1 亿,用户超 4 亿,你也在用的「知乎」是如何在超大规模 TiDB 集群上玩转多云多活的?来听听知乎代晓磊的答案!