Blog

Agility6

Trie树

Tech

Trie数可以快速的存储和查询字符串集合

用法

假设给定一组字符串abc,ab,bcf,abb,ab。最后需要去查找是否存在多少个ab字符串

代码实现

插入函数

回忆一下步骤,先判断是否在trie树上,如果不存在则创建节点,存在则切换为对应的下标,最后将cnt[]数组对应的最后一个字符自增


  public void insert(String str) {

    int p = 0; // 存储节点的下标
    for (int i = 0; i < str.length(); i++) {

      int u = str.charAt(i) - 'a'; // 将son[][u] u语义化,这里将小写字母语义化为int

      if (son[p][u] == 0) {
        son[p][u] = ++index; // 创建节点,节点的下标通过index生成
      }

      p = son[p][u]; // 当前字符存在,则切换到该节点
    }

    cnt[p]++; // 遍历到最后一个字符说明添加完成,进行标记
  }

查询

查询的逻辑也十分类似,只要遍历到字符串中有字符不存在节点则说明,没有该字符串。当遍历到最后一个字符说明有该字符串,直接获取cnt[]中记录的个数即可


  public int query(String str) {

    int p = 0;

    for (int i = 0; i < str.length(); i++) {

      int u = str.charAt(i) - 'a';

      if (son[p][u] == 0) return 0;

      p = son[p][u];
    }

    return cnt[p];
  }

重点