【Java每日一题,字典树】 统计难题

简介: 【Java每日一题,字典树】 统计难题

Introduction

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).


Input

输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.


注意:本题只有一组测试数据,处理到文件结束.


Output

对于每个提问,给出以该字符串为前缀的单词的数量.


Sample

input

banana
band
bee
absolute
acm
ba
b
band
abc

output

2
3
1
0

Solution

package week3;
import java.util.HashMap;
import java.util.Scanner;
/**
 * @author liangyuanshao
 * @date 2022/5/3 - 9:02
 */
public class Main {
  public static class TrieTree{
    public TrieTreeNode root=new TrieTreeNode();
    class TrieTreeNode{
      int path=0;
      int end=0;
      HashMap<Character,TrieTreeNode> nodeMap=new HashMap<>();
    }
    public void insertString(String string){
      if(string.equals("")||string==null)return;
      int len=string.length();
      TrieTreeNode node=root;
      for(int i=0;i<len;i++){
        char ch=string.charAt(i);
        HashMap<Character,TrieTreeNode> nodeMap=node.nodeMap;
        if(!nodeMap.containsKey(ch)){
          TrieTreeNode newNode=new TrieTreeNode();
          nodeMap.put(ch,newNode);
        }
        node.path++;
        node=nodeMap.get(ch);
      }
      node.path++;
      node.end++;
    }
    public int getPrefixNum(String string){
      int len=string.length();
      TrieTreeNode node=root;
      for(int i=0;i<len;i++){
        char ch=string.charAt(i);
        TrieTreeNode newNode=node.nodeMap.get(ch);
        if(newNode==null){
          return 0;
        }
        node=newNode;
      }
      return node.path;
    }
  }
  public static void main(String[] args) {
    Scanner s=new Scanner(System.in);
    TrieTree trieTree=new TrieTree();
    while (true){
      String string=s.nextLine();
      if(string.equals("")){
        break;
      }
      trieTree.insertString(string);
    }
    while (s.hasNext()){
      String string=s.nextLine();
      System.out.println(trieTree.getPrefixNum(string));
    }
  }
}

Experience

第一次使用字典树,所以开始搜了java如何构造字典树。


前缀树又名字典树,单词查找树,Trie树,是一种多路树形结构,是哈希树的变种,和hash效率有一拼,是一种用于快速检索的多叉树结构。


典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高


相关文章
|
10月前
|
Arthas Java 中间件
如何优雅的在java中统计代码块耗时
如何优雅的在java中统计代码块耗时
108 1
|
10月前
|
人工智能 算法 Java
第十三届蓝桥杯B组Java(试题C:字符统计)
第十三届蓝桥杯B组Java(试题C:字符统计)
133 0
|
2月前
|
存储 Java BI
java怎么统计每个项目下的每个类别的数据
通过本文,我们详细介绍了如何在Java中统计每个项目下的每个类别的数据,包括数据模型设计、数据存储和统计方法。通过定义 `Category`和 `Project`类,并使用 `ProjectManager`类进行管理,可以轻松实现项目和类别的数据统计。希望本文能够帮助您理解和实现类似的统计需求。
119 17
|
7月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
60 0
|
9月前
|
Java Serverless
Java字符个数统计代码
Java字符个数统计代码
111 6
|
9月前
|
Java
java使用Files.walkFileTree统计文件夹下的文件夹和文件数量
java使用Files.walkFileTree统计文件夹下的文件夹和文件数量
131 0
|
9月前
|
Java
2022蓝桥杯大赛软件类省赛Java大学B组真题 刷题统计
2022蓝桥杯大赛软件类省赛Java大学B组真题 刷题统计
85 0
|
10月前
|
Java API Scala
【Flink】Flink Java 统计词频 开发
【1月更文挑战第26天】【Flink】Flink Java 统计词频 开发
|
10月前
|
存储 Java API
Java统计功能
Java统计功能
86 0
|
10月前
|
Java C++ Python
Rust每日一练(Leetday0016) 全排列I\II、旋转图像
Rust每日一练(Leetday0016) 全排列I\II、旋转图像
62 0
Rust每日一练(Leetday0016) 全排列I\II、旋转图像

热门文章

最新文章