前缀树:

  假设一个字符串数组,“abcd”,"bcd","gef" , 构建一颗树,字母是在路径上,节点上最基本的存储的信息包括:

    以这个节点结尾的 字符串的数量;

    经过这个节点的字符串的数量;

一个字符串类型的数组arr1,另一个字符串类型的数组arr2;

(1)arr2中有哪些字符,是arr1中出现的?请打印

(2)arr2中有哪些字符,是作为arr1中某个字符串前缀出现的?请 打印

(3)arr2中有哪些字符,是作为arr1中某个字符串前缀出现的?请打印 arr2中出现次数最大的前缀

 package my_basic.class_7;

 public class Code_00_TrieTree {
//前缀树
public static class TrieNode{
public int end;
public int path;
public TrieNode[] nexts; public TrieNode() {
end = 0;
path = 0;
nexts = new TrieNode[26]; //之前没写 空指针
} } public static class Trie{
private TrieNode root;
public Trie() {
root = new TrieNode();
} public void insert(String word) {
if (word == null) {
return;
}
char[] chs = word.toCharArray();
int index = 0;
TrieNode node = root;
for (int i = 0; i < chs.length; i++) {
index = chs[i] - 'a';
if (node.nexts[index] == null) {
node.nexts[index] = new TrieNode(); }
node = node.nexts[index];
node.path++;
}
node.end++;
} public int search(String word) {
if (word == null) {
return 0;
}
char[] chs = word.toCharArray();
int index = 0;
TrieNode node = root;
for (int i = 0; i < chs.length; i++) {
index = chs[i] - 'a';
if (node.nexts[index] == null) {
return 0;
}
node = node.nexts[index];
}
return node.end;
} public void delete(String word) {
if (word == null) {
return;
}
char[] chs = word.toCharArray();
int index = 0;
TrieNode node = root;
for (int i = 0; i < chs.length; i++) {
index = chs[i] - 'a';
if (--node.nexts[index].path == 0) {
node.nexts[index] = null; //后面的节点直接删去
return;
}
node = node.nexts[index];
}
node.end--;
} public int prefixNumber(String word) {
if (word == null) {
return 0;
}
char[] chs = word.toCharArray();
int index = 1;
TrieNode node = root;
for (int i = 0; i < chs.length; i++) {
index = chs[i] - 'a';
if (node.nexts[index] == null) {
return 0;
}
node = node.nexts[index];
}
return node.path;
}
} public static void main(String[] args) {
String[] arr1 = {"abc","bcd","def","bcf"};
String[] arr2 = {"b","a","bc"};
Trie trie = new Trie();
for (int i = 0; i < arr1.length; i++) {
trie.insert(arr1[i]);
}
//arr2中有哪些字符,是arr1中出现的
for (int i = 0; i < arr2.length; i++) {
if (trie.search(arr2[i]) != 0) {
System.out.print(arr2[i] + " ");
}
}
System.out.println(" ");
System.out.println("===================================");
//arr2中有哪些字符,是作为arr1中某个字符串前缀出现的?
for (int i = 0; i < arr2.length; i++) {
if (trie.prefixNumber(arr2[i]) != 0) {
System.out.print(arr2[i] + " ");
}
}
System.out.println(" ");
System.out.println("==================================="); String res = null;
int pre = 0;
for (int i = 0; i < arr2.length; i++) {
int prefixNum = trie.prefixNumber(arr2[i]);
if (prefixNum != 0) {
System.out.print(arr2[i] + " ");
if(prefixNum >= pre) {
res = arr2[i];
pre = prefixNum;
}
}
}
System.out.println();
System.out.println(res); // Trie trie = new Trie();
// System.out.println(trie.search("zuo"));
// trie.insert("zuo");
// System.out.println(trie.search("zuo"));
// trie.delete("zuo");
// System.out.println(trie.search("zuo"));
// trie.insert("zuo");
// trie.insert("zuo");
// trie.delete("zuo");
// System.out.println(trie.search("zuo"));
// trie.delete("zuo");
// System.out.println(trie.search("zuo"));
// trie.insert("zuoa");
// trie.insert("zuoac");
// trie.insert("zuoab");
// trie.insert("zuoad");
// trie.delete("zuoa");
// System.out.println(trie.search("zuoa"));
// System.out.println(trie.prefixNumber("zuo")); }
}

  

前缀树,trie树的更多相关文章

  1. Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结

    Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...

  2. 字典树(Trie树)的实现及应用

    >>字典树的概念 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树.与二叉查找树不同,Trie树的 ...

  3. [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序

    一. 题目 487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 274040   Accepted: 48891 ...

  4. 洛谷$P4585\ [FJOI2015]$火星商店问题 线段树+$trie$树

    正解:线段树+$trie$树 解题报告: 传送门$QwQ$ $umm$题目有点儿长我先写下题目大意趴$QwQ$,就说有$n$个初始均为空的集合和$m$次操作,每次操作为向某个集合内加入一个数$x$,或 ...

  5. luoguP6623 [省选联考 2020 A 卷] 树(trie树)

    luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...

  6. [转载]字典树(trie树)、后缀树

    (1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...

  7. 【HDU - 5790 】Prefix(主席树+Trie树)

    BUPT2017 wintertraining(15) #7C 题意 求[min((Z+L)%N,(Z+R)%N)+1,max((Z+L)%N,(Z+R)%N)+1]中不同前缀的个数,Z是上次询问的结 ...

  8. 字典树 trie树 学习

    一字典树 字典树,又称单词查找树,Trie树,是一种树形结构,哈希表的一个变种   二.性质 根节点不包含字符,除根节点以外的每一个节点都只包含一个字符: 从根节点到某一节点,路径上经过的字符串连接起 ...

  9. 【字符串算法】字典树(Trie树)

    什么是字典树 基本概念 字典树,又称为单词查找树或Tire树,是一种树形结构,它是一种哈希树的变种,用于存储字符串及其相关信息. 基本性质 1.根节点不包含字符,除根节点外的每一个子节点都包含一个字符 ...

  10. 字典树 Trie树

    什么是Trie树? 形如 其中从根节点到红色节点的路径上的字母所连成的字符串即为一个Trie树上所存的字符串. 比如,这个trie树上有ab,abc,bd,dda这些字符串. 至于怎么构建和查找或添加 ...

随机推荐

  1. 推荐一款让你纵横Github的读码神器

    当我们想深入了解一个开源项目的时候,通常我们有以下几种姿势: 懒汉型 通过Web的方式,逐个的点击页面寻找和查看具体的源码内容. 优点:不依赖任何工具,无须任何额外的操作 缺点:效率低下,查找文件不便 ...

  2. php 生成图片,只获取字节数据,不以图片格式输出

    提示:与直接将结果输出到浏览器的任何内容一样,可以使用输出控制函数(http://www.php.net/./en/ref.outcontrol.php)捕获此函数的输出,并将其保存在字符串(例如)中 ...

  3. Fire (poj 2152 树形dp)

    Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...

  4. Django + Vue cli 3.0 访问静态资源问题

    [问题背景] 用Vue clie 3.0的搭建得框架把我坑死了,在打包后,调用不到静态资源js,css,mp3等 [问题原因] vue cli 3.0打包后,dist目录下没有static目录,而Dj ...

  5. 洛谷P2136 拉近距离

    题目背景 我是源点,你是终点.我们之间有负权环. --小明 题目描述 在小明和小红的生活中,有\(N\)个关键的节点.有\(M\)个事件,记为一个三元组\((S_i,T_i,W_i)\),表示从节点\ ...

  6. [Android]进程间通信的方法

    一.管道 管道是进程间通信中最古老的方式,它包括 无名管道 和 有名管道两种,前者用于父进程和子进程间的通信,后者用于运行于同一台机器上的任意两个进程间的通信. 无名管道由pipe()函数创建. #i ...

  7. Codeforces 1C(外接圆与正多边形)

    要点 各点肯定都在外接圆上,边越多越接近圆面积,所以要最小面积应当取可能的最少边数. 给三角形求外接圆半径公式:\(R=\frac{abc}{4S}\). 三个角度对应的圆心角取gcd即是要求的正多边 ...

  8. mac下配置php+mysql+nginx遇到的问题

    1.mysql:没有useradd和groupadd命令,好在原来的/etc/passwd有了mysql,www用户,/etc/group下也有了mysql,www用户组 2.nginx:编译ngin ...

  9. CountDownLatch MyUncaughtExceptionHandler

    package com.yd.wmsc.util; import java.text.SimpleDateFormat; import java.util.Date; import java.util ...

  10. 爬虫(ProxyHandler)——代理

    工具:python3 步骤: 1)使用ProxyHandler()构建httpproxy_handler对象 2)使用build_opener(httpproxy_handler)构建opener 3 ...