文章目录
- 一.trie树字典树初理解
- 1.1 trie树字典树是用于做什么的
- 1.2 trie树字典树理论
- 1.3 trie树字典树代码实现
- 1.3.1 声明
- 1.3.2 insert插入
- 1.3.3 query查找
- 二.trie树字典树思想力扣实战
- 2.1最长公共前缀
自我介绍:hello!这里是欧_aita的频道,一个初学数据结构与算法的小白。
小欧的今日语录: 青春由磨砺而出彩,人生因奋斗而升华!
小欧的祝福语:让我们在未来的道路上共同进步!
大家可以在评论区畅所欲言,可以指出我的错误,在交流中共同进步。
如果你也恰好在学习C++或者数据结构与算法那就来看看主页吧—— 欧_aita。
字典树(TrieTree),是一种树形结构,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串,如01字典树)。主要思想是利用字符串的公共前缀来节约存储空间。很好地利用了串的公共前缀,节约了存储空间。字典树主要包含两种操作,插入和查找。
实现查找好比说我要实现查找出abdon,会从根节点开始查找第一个字母a,找到后再接着查找第二个单词b。重复这个过程,直到查找到n,并且发现n字母被标记,即查找结束。但是如果找到了一个完整的字符串却发现最后一个字母没有标记呢?就如同查找字符串ab,发现b并没有被标记,结果就是不算查找到。
————————————————————————————————
实现插入这是用到数组实现的,每个父节点最多都会有26个子节点,这分别对应了26个字母,在插入的过程之中会用到一个idx表示插入了多少个节点。a是第一个插入的节点,即idx对应1。比如根节点的子节点a为son[0][1]=1,然后通过索引1可以插入a的子节点son[1][2]=b的插入排序数字。
定义的这些可以先不看,然后在后续的代码片段里理解这些变量的作用。
#include
using namespace std;
const int N=100010;
int p,cnt[N],son[N][25];
char str[N];
u的作用是存储的字母的ASCII码值,判断在son[][]二维数组中存储在哪,也就是说会存储在son[][u]的位置,并且位置表示字母,数组里面存储的是索引,是用来查找下一个字母的。
在插入的过程中肯定是一个从无到有的过程,使用if条件语句,如果没有就创造,如果有就顺势向下。
cnt[]数组表示存储了多少个字符串,数组中有多少个值不为零就有多少个字符串已存储。
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=p[p][u];
}
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];
}
string longcommonprofix(vector<String>& strs[])
{
string& str[]=strs[0];
int len=str.size();
for(int i=0;i<strs.size();i++)
{
len = min(len,(int)strs[i].size());
for(int k=0;strs[i][k];k++)
if(str[k]!=strs[i][k])
{
len=k;
break;
}
}
return str.substr(0,len);
}
substr(x,y)表示的意思是从字符串中输出从x到y的一串字符串。其中x下0和1表示的都是从最左边一个输出至第 y个字符,包含空格在内。
若x=-1,表示的意思是从右向左的第一个字符开始。
这道题算是把字典树的思想应用了一遍,并不是难题,不过有收获了许多。
这篇文章就到此为止,如果觉得读完后对你有所帮助的话就点个赞吧,你们的支持是我最大的动力!