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-12-26大厂数据结构与算法教程:入门级详解
- 2024-12-26大厂算法与数据结构教程:新手入门指南
- 2024-12-26Python编程入门指南
- 2024-12-26数据结构高级教程:新手入门及初级提升指南
- 2024-12-26并查集入门教程:从零开始学会并查集
- 2024-12-26大厂数据结构与算法入门指南
- 2024-12-26大厂算法与数据结构入门教程
- 2024-12-26二叉树入门教程:轻松掌握基础概念与操作
- 2024-12-26初学者指南:轻松掌握链表
- 2024-12-26平衡树入门教程:轻松理解与应用