又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 ——百度百科

插入字符串

abcd

ac

bac

bad

词典数据库java java电子词典_字符串

基本思路

字符串存储:
Trie树是从根节点开始(0号节点),依次查询字符串中的每个字符,若已经在树中存在,则查询下一个字符;若不存在则创建这个节点。当全部字符查询完成之后,在最后一个节点做一个标记表明这里存在一个字符串。

字符串查询
与查询类似,依次查询字符串中的每个字符,若不存在,则树中不存在此字符串;当查询到最后一个字符,如果不存在标记,则字符串不存在。

问题描述

维护一个字符串集合,支持两种操作:

“I x”向集合中插入一个字符串x;
“Q x”询问一个字符串在集合中出现了多少次。
共有N个操作,输入的字符串总长度不超过 105
,字符串仅包含小写英文字母。

输入格式

第一行包含整数N,表示操作数。

接下来N行,每行包含一个操作指令,指令为”I x”或”Q x”中的一种。

输出格式

对于每个询问指令”Q x”,都要输出一个整数作为结果,表示x在集合中出现的次数。

每个结果占一行。

数据范围

词典数据库java java电子词典_词典数据库java_02

代码实现

数据结构:大小为N*26的二维int数组s[][]存储字符串(26个字母);大小为N的int数组a[]存储每个节点对应的字符串个数;int变量idx表示节点下标

方法:

static void insert(String str){
        char[]a = str.toCharArray();
        int p = 0;
        for (int i = 0; i < a.length; i++) {
            int u = a[i]-'a';//将字符转换为数字
            if(s[p][u]==0)s[p][u]=++idx;//不存在节点,创建节点
            p = s[p][u];//接着往下走
        }
        cnt[p]++;
    }
static int query(String str){
      char[]a = str.toCharArray();
      int p = 0;
      for (int i = 0; i < a.length; i++) {
          int u = a[i]-'a';
          if(s[p][u]==0)return 0;
          p = s[p][u];

      }
      return cnt[p];
  }