PrefixTree

208. 实现 Trie (前缀树)

Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。

请你实现 Trie 类:

  • Trie() 初始化前缀树对象。
  • void insert(String word) 向前缀树中插入字符串 word
  • boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false
  • boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false

示例:

  1. 输入
  2. ["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
  3. [[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
  4. 输出
  5. [null, null, true, false, true, null, true]
  6. 解释
  7. Trie trie = new Trie();
  8. trie.insert("apple");
  9. trie.search("apple"); // 返回 True
  10. trie.search("app"); // 返回 False
  11. trie.startsWith("app"); // 返回 True
  12. trie.insert("app");
  13. trie.search("app"); // 返回 True

提示:

  • 1 <= word.length, prefix.length <= 2000
  • wordprefix 仅由小写英文字母组成
  • insertsearchstartsWith 调用次数 总计 不超过 3 * 104

实现代码:支持可变 wordList 的 Trie

  1. class Trie {
  2. private final Node root = new Node('/');
  3. public void insert(char[] text) {
  4. Node p = root;
  5. for (char c : text) {
  6. int index = c - 'a';
  7. if (p.children[index] == null) {
  8. Node newNode = new Node(c);
  9. p.children[index] = newNode;
  10. }
  11. p = p.children[index];
  12. }
  13. p.isEndingChar = true;
  14. }
  15. public boolean find (char[] pattern) {
  16. Node p = root;
  17. for (char c : pattern) {
  18. int index = c - 'a';
  19. if (p.children[index] == null) {
  20. return false;
  21. }
  22. }
  23. return p.isEndingChar;
  24. }
  25. private static class Node {
  26. public char data;
  27. public boolean isEndingChar = false;
  28. public Node[] children = new Node[26];
  29. public Node(char r) {
  30. this.data = r;
  31. }
  32. }
  33. }

面试题 17.17. 多次搜索

给定一个较长字符串big和一个包含较短字符串的数组smalls,设计一个方法,根据smalls中的每一个较短字符串,对big进行搜索。输出smalls中的字符串在big里出现的所有位置positions,其中positions[i]smalls[i]出现的所有位置。

示例:

  1. 输入:
  2. big = "mississippi"
  3. smalls = ["is","ppi","hi","sis","i","ssippi"]
  4. 输出: [[1,4],[8],[],[3],[1,4,7,10],[5]]

提示:

  • 0 <= len(big) <= 1000
  • 0 <= len(smalls[i]) <= 1000
  • smalls的总字符数不会超过 100000。
  • 你可以认为smalls中没有重复字符串。
  • 所有出现的字符均为英文小写字母。

题解思想:Trie 树

  1. class Solution {
  2. class TrieNode {
  3. String end;
  4. TrieNode[] next = new TrieNode[26];
  5. }
  6. class Trie {
  7. TrieNode root;
  8. public Trie(String[] words) {
  9. root = new TrieNode();
  10. for (String word : words) {
  11. TrieNode node = root;
  12. for (char r : word.toCharArray()) {
  13. int i = r - 'a';
  14. if (node.next[i] == null) {
  15. node.next[i] = new TrieNode();
  16. }
  17. node = node.next[i];
  18. }
  19. node.end = word;
  20. }
  21. }
  22. public List<String> search(String str) {
  23. TrieNode node = root;
  24. List<String> res = new ArrayList<>();
  25. for (char c : str.toCharArray()) {
  26. int i = c - 'a';
  27. if (node.next[i] == null) {
  28. break;
  29. }
  30. node = node.next[i];
  31. if (node.end != null) {
  32. res.add(node.end);
  33. }
  34. }
  35. return res;
  36. }
  37. }
  38. public int[][] multiSearch(String big, String[] smalls) {
  39. Trie trie = new Trie(smalls);
  40. Map<String, List<Integer>> hit = new HashMap<>();
  41. for (int i = 0; i < big.length(); i ++) {
  42. List<String> matchs = trie.search(big.substring(i));
  43. for (String word : matchs) {
  44. if (!hit.containsKey(word)) {
  45. hit.put(word, new ArrayList<>());
  46. }
  47. hit.get(word).add(i);
  48. }
  49. }
  50. int[][] res = new int[smalls.length][];
  51. for (int i = 0; i < smalls.length; i ++) {
  52. List<Integer> list = hit.get(smalls[i]);
  53. if (list == null) {
  54. res[i] = new int[0];
  55. continue;
  56. }
  57. int size = list.size();
  58. res[i] = new int[size];
  59. for (int j = 0; j < size; j ++) {
  60. res[i][j] = list.get(j);
  61. }
  62. }
  63. return res;
  64. }
  65. }

Trie树结构的更多相关文章

  1. Trie和Ternary Search Tree介绍

    Trie树 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie树与二叉搜索树不同,键不是直接保存在节 ...

  2. Trie树(转:http://blog.csdn.net/arhaiyun/article/details/11913501)

    Trie 树, 又称字典树,单词查找树.它来源于retrieval(检索)中取中间四个字符构成(读音同try).用于存储大量的字符串以便支持快速模式匹配.主要应用在信息检索领域. Trie 有三种结构 ...

  3. Double-Array Trie 原理解析

     http://ansjsun.iteye.com/blog/702255     Trie树是搜索树的一种,它在本质上是一个确定的有限状态自动机,每个结点代表一个状态,根据输入变量的不同,进行状态转 ...

  4. Trie树子节点快速获取法

    今天做了一道leetcode上关于字典树的题:https://leetcode.com/problems/word-search-ii/#/description 一开始坚持不看别人的思路,完全自己写 ...

  5. poj_3630 trie树

    题目大意 给定一系列电话号码,查看他们之间是否有i,j满足,号码i是号码j的前缀子串. 题目分析 典型的trie树结构.直接使用trie树即可.但是需要注意,若使用指针形式的trie树,则在大数据量下 ...

  6. python中文分词:结巴分词

    中文分词是中文文本处理的一个基础性工作,结巴分词利用进行中文分词.其基本实现原理有三点: 基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG) 采用了动态规 ...

  7. Python 结巴分词

    今天的任务是对txt文本进行分词,有幸了解到"结巴"中文分词,其愿景是做最好的Python中文分词组件.有兴趣的朋友请点这里. jieba支持三种分词模式: *精确模式,试图将句子 ...

  8. 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)

    转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...

  9. Python 结巴分词模块

    原文链接:http://www.gowhich.com/blog/147?utm_source=tuicool&utm_medium=referral PS:结巴分词支持Python3 源码下 ...

  10. 阿里巴巴笔试整理系列 Session2 高级篇

    阿里一面:1. 入场就是红黑树,B数2. apache和nginx源码看过多少,平时看过什么技术论坛,还有没有看过更多的开源代码3. pthread 到自旋锁4. hadoop源码看过没5. 为什么选 ...

随机推荐

  1. linux里mysql数据库导入数据结构,丢失了索引 解决步骤

    1.网上可查 索引导出语句:(导出语句并没将索引导出而是全部查出来) SELECTCONCAT('ALTER TABLE `',TABLE_NAME,'` ', 'ADD ', IF(NON_UNIQ ...

  2. 建议收藏| 学python的看过来,Python 史上最全第三方库收集

    发现一个宝藏网站: GitHub 上有一个 Awesome - XXX 系列的资源整理,这个系列以"全"闻名,但凡是有一定知识度的领域.语言.框架等,都有自己的 awesome-x ...

  3. MySQL备份管理

    MySQL备份管理 目录 MySQL备份管理 一.MySQL备份管理 1.1.1 MySQL备份管理介绍 1.1.2 基于mysqldump的备份恢复 1.1.3 基于xtrabackup软件的物理备 ...

  4. Spring系列之字段格式化-13

    字段格式化 Spring 3 引入了一个方便的SPI,它为客户端环境的实现Formatter提供了一个简单而健壮的替代方 Formatter Formatter实现字段格式化逻辑的SPI . pack ...

  5. char *setlocale(int category, const char *locale)

    category -- 这是一个已命名的常量,指定了受区域设置影响的函数类别. LC_ALL 包括下面的所有选项. LC_COLLATE 字符串比较.参见 strcoll(). LC_CTYPE 字符 ...

  6. nodejs的框架koa

    koa:应用程序是一个包含一组中间件函数的对象,它是按照类似堆栈的方式组织和执行的 应用程序: 1.导入 const Koa = require('koa'); 2.创建koa的app实例 const ...

  7. 12.21linux学习第二十天

    今天老刘讲最后一章,第20章使用LNMP架构部署动态网站环境.定制安装17个安装包,编译安装要花很长时间,需要漫长的等待. LNMP动态网站部署架构是一套由Linux + Nginx + MySQL ...

  8. 用bat文件,自动进入cmd虚拟环境

    L:cd L:\myenv\Scriptscmd /K activate.bat  这行,这样写,cmd窗口会继续保留,按任意键也不会关闭. 这个问题网上大部分说法是在批处理里面加上 cmd /k, ...

  9. 关于Lua中的面向对象实现

    写在前面 最近在琢磨"Lua热重载",在测试中发现我之前对Lua中的面向对象实现有一些理解发生变化,这里记录一下. 本文提到的面向对象实现来自云风. 类实现 <Lua程序设计 ...

  10. String类型时间与Date时间转换

    1. String类型的时间转为DateTime public static Date transferString2Date(String s) { Date date = new Date(); ...