一个简单的统计问题(解决方案:Trie树)
题目如图
输入几个不重复的单词和几个前缀,分别统计出单词中包含前缀的个数。

Trie树
这个题目用到了 Trie 树.它在百度百科中的定义如下:在计算机科学中,Trie,又称字典树、单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。Trie的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。它有3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符。从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。每个节点的所有子节点包含的字符都不相同。
代码示例
package algorithm.tree;
public class Trie {
class Node {
char value;
byte end = 0;
Node[] next = new Node[26];
int count;
}
private Node root;
public Trie() {
root = new Node();
}
public boolean put(String value) {
if (value == null || value.isEmpty()) {
return false;
}
Node p = root;
int index;
char[] values = value.toCharArray();
for (int i = 0; i < values.length; i++) {
index = values[i] - 'a';
if (p.next[index] == null) {
Node node = new Node();
node.value = values[i];
p.next[index] = node;
}
p = p.next[index];
p.end = 0;
p.count++;
}
p.end = 1;
return true;
}
public boolean find(String value,boolean pattern) {
if (value == null || value.isEmpty()) {
return false;
}
Node p = root;
char[] values = value.toCharArray();
for (int i = 0; i < values.length; i++) {
int index = values[i] - 'a';
if (p.next[index] == null) {
return false;
}
p = p.next[index];
}
return pattern ? true : p.end == 1;
}
public int count(String value) {
if (value == null || value.isEmpty()) {
return 0;
}
Node p = root;
char[] values = value.toCharArray();
for (int i = 0; i < values.length; i++) {
int index = values[i] - 'a';
if (p.next[index] == null) {
return 0;
}
p = p.next[index];
}
return p.count;
}
}
测试
public static void main(String[] args) {
Trie trie = new Trie();
trie.put("banana");
trie.put("band");
trie.put("bee");
trie.put("absolute");
trie.put("acm");
//2
int count1 = trie.count("ba");
//3
int count2 = trie.count("b");
//1
int count3 = trie.count("band");
//0
int count4 = trie.count("abc");
}
一个简单的统计问题(解决方案:Trie树)的更多相关文章
- 统计难题(trie树)
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...
- hdu 1251:统计难题[【trie树】||【map】
<题目链接> 统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131 ...
- HDU1251 统计难题 【trie树】
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Total Subm ...
- HDU 1251 统计难题 (Trie树模板题)
题目链接:点击打开链接 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单 ...
- HDU - 1251 统计难题(Trie树)
有很多单词(只有小写字母组成,不会有重复的单词出现) 要统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). 每个单词长度不会超过10. Trie树的模板题.这个题内存把控不好容易MLE. ...
- PKU2418_树种统计(map应用||Trie树)
Description Hardwoods are the botanical group of trees that have broad leaves, produce a fruit or nu ...
- hdu 1251 统计难题(trie 树的简单应用)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意:给你多个字符串,求以某个字符串为前缀的字符串数量. 思路:简单的trie数应用,在trie ...
- 一个简单的统计图像主颜色的算法(C#源代码)
前段日子有朋友咨询了下分析图像主颜色的算法,我对这一块也没有什么深入的研究,参考了一些小代码,然后自己写了一个很简单的小工具,现共享给大家. 界面截图如下: 算法的原理很简单,就是统计出图像中各种颜色 ...
- AcWing243一个简单的整数问题2(树状数组+差分+前缀和规律)
题目地址:https://www.acwing.com/problem/content/244/ 题目描述: 给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“C l r d ...
随机推荐
- EF 调用oracle 存储过程
EF是如何调用的存储过程的,本人也是翻遍了个大网站,查阅了很多资料.终于解决了遇到的问题. 第一步:创建存储过程,在这里我就不多说了,不是文章说的重点. declare O_VOUCHER_ACT_D ...
- Linux学习6-Linux常用命令(1)
1.命令格式:命令 [-选项] [参数] 例如:ls -la /etc 说明: 1)个别命令使用不遵循此格式 2)当有多个选项时,可以写在一起 3)简化选项与完整选项 (-a等于 -- ...
- python学习之老男孩python全栈第九期_数据库day004知识点总结 —— MySQL数据库day4
复习: 1. MySQL:文件管理的软件 2. 三部分: - 服务端 - SQL语句 - 客户端 3. 客户端: - MySQL - navicat 4. 授权操作: - 用户操作 - 授权操作 5. ...
- PHPCMS v9上传图片提示"undefined"的解决办法
把phpcms\modules\attachment\attachments.php中将 if(empty($this->userid)){改成 if(empty($_POST['userid' ...
- sql语句执行出错:Incorrect integer value: '' for column 'id' at row 1
经检验:mysql5以上的版本如果是空值应该要写NULL. 例如:insert into web_works (work_id,work_name,work_number) values ('','$ ...
- thinkPHP的几个系统常量
echo "当前请求:" . __SELF__ . '<br>'; echo "当前分组:" . __MODULE__ . '<br>' ...
- 关于jsp页面中时间显示问题
首先说明一下情况,在MySQL数据库中获取的时间显示在jsp页面中不是按指定格式显示,显示的是类似于这种--Tue Jun 18 00:00:00 CST 2013.而想要的仅仅是年月日而已. 对于这 ...
- 带你从零学ReactNative开发跨平台App开发(七)
ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...
- Grunt-学习。
Grunt 依赖 Node.js 所以在安装之前确保你安装了 Node.js.然后开始安装 Grunt 实际上,安装的并不是 Grunt,而是 Grunt-cli,也就是命令行的 Grunt,这样你就 ...
- lock free数据结构内存回收技术-hazard pointer
lock free数据结构一般来说拥有比基于lock实现的数据结构更高的性能,但是其实现比基于lock的实现更为复杂,需要处理的难题包括预防ABA问题,内存如何重用和回收等.通常,最简单最有效的处理A ...