导航

字典树 -- 单词替换

Posted on 2022-07-07 23:33  wuqiu  阅读(21)  评论(0编辑  收藏  举报

字典树

字典树的定义

字典树是一种以树状结构来表示字符串的一种数据结构,通过在树上遍历,来确定给定的某一字符串是否曾经出现过。它可以最大限度的减少比较次数,在字符串比对上查询效率很高。

字典树的实现

在这里笔者采用了二维数组的方式对字典树进行构造。当然,字典树的表示方式并不只有这一种,其中以链式结构对字典树进行存储的方式最为直观。

所需数据结构

//字典树第一维所需要开辟的大小并没有确切的量度,在构建过程中,每出现一个之前没有出现的排列,字典树就要加一行。
int trie[N][26];
//tot代表着某个节点下一个节点的索引,由于数组初始化都为0,所以tot的初始值为1
int tot = 1;

建树函数实现

void insert(string s){
    len=s.length();//单词s的长度
    root=0;//每个单词的第一个字母都出现在字典树的第一行
    for(int i=0;i<len;i++)
    {
        int id=s[i]-'a';
        //第root行 第id列表示的是一个字母
        if(!trie[root][id])//如果之前它没有出现过
                    trie[root][id]=++tot;//给它新添加一个编号
        root=trie[root][id];//第root行 第id列中存储的值是下一个字母所在的行数
    }
}

查询函数实现

bool find(string s){
    int len = s.length();
    root = 0;//第一个字母都存储在第0行
    for(int i = 0 ; i <= len - 1;i++){
        int x=s[i]-'a';
        if(trie[root][x]==0)   return false;//如果说root这一行中没有x这个字母,则返回失败
        root=trie[root][x];  //如果有这个字母,则继续寻找下一个字母
    }
    return  true;
}