题目如图

  输入几个不重复的单词和几个前缀,分别统计出单词中包含前缀的个数。

Trie树

  这个题目用到了 Trie 树.它在百度百科中的定义如下:在计算机科学中,Trie,又称字典树、单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。Trie的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。它有3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符。从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。每个节点的所有子节点包含的字符都不相同。

代码示例

  1. package algorithm.tree;
  2. public class Trie {
  3. class Node {
  4. char value;
  5. byte end = 0;
  6. Node[] next = new Node[26];
  7. int count;
  8. }
  9. private Node root;
  10. public Trie() {
  11. root = new Node();
  12. }
  13. public boolean put(String value) {
  14. if (value == null || value.isEmpty()) {
  15. return false;
  16. }
  17. Node p = root;
  18. int index;
  19. char[] values = value.toCharArray();
  20. for (int i = 0; i < values.length; i++) {
  21. index = values[i] - 'a';
  22. if (p.next[index] == null) {
  23. Node node = new Node();
  24. node.value = values[i];
  25. p.next[index] = node;
  26. }
  27. p = p.next[index];
  28. p.end = 0;
  29. p.count++;
  30. }
  31. p.end = 1;
  32. return true;
  33. }
  34. public boolean find(String value,boolean pattern) {
  35. if (value == null || value.isEmpty()) {
  36. return false;
  37. }
  38. Node p = root;
  39. char[] values = value.toCharArray();
  40. for (int i = 0; i < values.length; i++) {
  41. int index = values[i] - 'a';
  42. if (p.next[index] == null) {
  43. return false;
  44. }
  45. p = p.next[index];
  46. }
  47. return pattern ? true : p.end == 1;
  48. }
  49. public int count(String value) {
  50. if (value == null || value.isEmpty()) {
  51. return 0;
  52. }
  53. Node p = root;
  54. char[] values = value.toCharArray();
  55. for (int i = 0; i < values.length; i++) {
  56. int index = values[i] - 'a';
  57. if (p.next[index] == null) {
  58. return 0;
  59. }
  60. p = p.next[index];
  61. }
  62. return p.count;
  63. }
  64. }

测试

  1. public static void main(String[] args) {
  2. Trie trie = new Trie();
  3. trie.put("banana");
  4. trie.put("band");
  5. trie.put("bee");
  6. trie.put("absolute");
  7. trie.put("acm");
  8. //2
  9. int count1 = trie.count("ba");
  10. //3
  11. int count2 = trie.count("b");
  12. //1
  13. int count3 = trie.count("band");
  14. //0
  15. int count4 = trie.count("abc");
  16. }

一个简单的统计问题(解决方案:Trie树)的更多相关文章

  1. 统计难题(trie树)

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  2. hdu 1251:统计难题[【trie树】||【map】

    <题目链接> 统计难题                        Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131 ...

  3. HDU1251 统计难题 【trie树】

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Subm ...

  4. HDU 1251 统计难题 (Trie树模板题)

    题目链接:点击打开链接 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单 ...

  5. HDU - 1251 统计难题(Trie树)

    有很多单词(只有小写字母组成,不会有重复的单词出现) 要统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). 每个单词长度不会超过10. Trie树的模板题.这个题内存把控不好容易MLE. ...

  6. PKU2418_树种统计(map应用||Trie树)

    Description Hardwoods are the botanical group of trees that have broad leaves, produce a fruit or nu ...

  7. hdu 1251 统计难题(trie 树的简单应用)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意:给你多个字符串,求以某个字符串为前缀的字符串数量. 思路:简单的trie数应用,在trie ...

  8. 一个简单的统计图像主颜色的算法(C#源代码)

    前段日子有朋友咨询了下分析图像主颜色的算法,我对这一块也没有什么深入的研究,参考了一些小代码,然后自己写了一个很简单的小工具,现共享给大家. 界面截图如下: 算法的原理很简单,就是统计出图像中各种颜色 ...

  9. AcWing243一个简单的整数问题2(树状数组+差分+前缀和规律)

    题目地址:https://www.acwing.com/problem/content/244/ 题目描述: 给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“C l r d ...

随机推荐

  1. 使用JavaScript动态更改CSS样式

    在很多情况下,都需要对网页上元素的样式进行动态的修改.在JavaScript中提供几种方式动态的修改样式,下面将介绍方法的使用.效果.以及缺陷. 1.使用obj.className来修改样式表的类名. ...

  2. C# 一个方法如何返回多个值

    通常一个方法只能返回一个值,但是如果在某些时候,我们想要返回多个值,例如某个方法将一个浮点数分割成一个整数和一个小数返回.这个时候我们就要用到out关键字. using System; namespa ...

  3. css文字属性

    font-family- css字体:设定时,需考虑浏览器中有无该字体. 比如说“黑体”  “微软雅黑” font-size -css字体大小: 注意度量html单位.例如:font-size:18p ...

  4. pom.xml配置文件内容记录

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  5. 葡萄城报表介绍:Java 报表

    一.Java 报表定义 Java 是一门面向对象编程语言,不仅吸收了 C++ 语言的各种优点,还摒弃了 C++ 里难以理解的多继承.指针等概念,因此 Java 语言具有功能强大和简单易用两个特征.Ja ...

  6. 玩转Android拍摄功能

    简单拍照与摄像 在富媒体开始流行之前,整个世界是一个灰暗且平淡无奇的地方.还记得Gopher吗?我或许不记得了.自从APP成为用户生活的一部分之后,这便给他们提供了一种方式可以来存放他们生活的细节.使 ...

  7. 612.1.002 ALGS4 | Analysis of Algorithms

    我们生活在大数的时代 培养数量级的敏感! Tip:见招拆招 作为工程师,你先要能实现出来. 充实基础,没有什么不好意思 哪怕不完美.但是有时候完成比完美更重要. 之后再去想优化 P.S.作者Rober ...

  8. Linux 启动脚本及chkconfig命令之自启动服务

    有时我们会碰到这样的情况,系统启动的时候报一大堆无法连接mysql的错误,问题在mysql数据库还没有启动的时候已经启动了一些需要连接mysql数据库的服务.这样我们就得修改启动顺序,把需要连接mys ...

  9. OpenLDAP 2.4 禁止匿名用户访问

    ldapmodify -Q -Y EXTERNAL -H ldapi:/// <<EOF dn: cn=config changetype: modify add: olcDisallow ...

  10. leetCode题解之字符最短路径解法2

    1.题目描述 2.分析 之前使用的大循环再向两边寻找的算法是 O(n^2)复杂度的,可以利用 multimap降低其复杂度. 3.代码 vector<int> shortestToChar ...