var findWords = function(grid, words) {// 存放最终结果集let res = []// 字典树节点class TrieNode {constructor(){this.end = falsethis.child = {}}}// 最终形成的字典树根节点let root = nulllet Trie = function(){root = new TrieNode()}// 建立字典树Trie.prototype.insert = (word) => {let cur = rootfor(let i=0;i<word.length;i++){if(!cur.child[word[i]]){cur.child[word[i]] = new TrieNode()}cur = cur.child[word[i]]}cur.end = true}// 在 Trie 树中查找键let searchPrefix = (word) => {let cur = rootfor(let i=0;i<word.length;i++){if(cur.child[word[i]]){cur = cur.child[word[i]]}else{return null}}return cur}Trie.prototype.search = (word) => {let cur = searchPrefix(word)return cur !== null && cur.end}// 查找 Trie 树中的键前缀Trie.prototype.startsWith = (pre) => {return searchPrefix(pre) != null}// 创建根节点let trie = new Trie()// 进行建树操作for(let i=0;i<words.length;i++){trie.insert(words[i])}let dfs = (x,y,t,cur) => {if(cur.end){res.push(t)cur.end = false // 避免重复计算}// 剪枝条件:1.边界处理 2.下一步是否可走 3.下一步字典树是否可走if(x<0 || x>=grid.length || y<0 || y>=grid[0].length || grid[x][y] == '#' || !cur.child[grid[x][y]]) returnlet tmp = grid[x][y]grid[x][y] = '#'  // 走cur = cur.child[tmp]dfs(x+1,y,t+tmp,cur)  // 上下左右四个方向遍历dfs(x,y+1,t+tmp,cur)dfs(x-1,y,t+tmp,cur)dfs(x,y-1,t+tmp,cur)grid[x][y] = tmp // 回溯(还原)}// 对单词表进行全局搜索for(let i=0;i<grid.length;i++){for(let j=0;j<grid[0].length;j++){dfs(i,j,'',root)}}return res
};let words = ["oath","pea","eat","rain"]
let grid =
[['o','a','a','n'],['e','t','a','e'],['i','h','k','r'],['i','f','l','v']
]
console.log(findWords(grid,words)) //[ 'oath', 'eat' ]

【leetcode】JS 字典树 建树 查找键 查找键前缀【模板】相关推荐

  1. 字典树简单实现 插入 查找 遍历

    字典树是一种存储字符串的高效的结构,它保存了不同字符的相同前缀,又因此叫做前缀树,使用前缀,大大避免相同字符的重复匹配,加快查找效率 字典树是一颗多叉树,比如存储26个字母的,那么就有26叉 字典树的 ...

  2. c语言 trie树,C语言实现Trie树(字典树)的插入查找删除与遍历操作

    Trie树,也称作是字典树,是一种哈希树的变种,查询效率较高.Trie树可以用于统计或者排序大量的字符串,比如对一系列字符串按照字典序排序. 字典树是一个多叉树,每一个节点上存储的不是一个字符串,而是 ...

  3. 【字典树】添加和查找单词

    为什么80%的码农都做不了架构师?>>>    Add and Search Word - Data structure design 问题: Design a data struc ...

  4. 【亡羊补牢】挑战数据结构与算法 第19期 LeetCode 212. 单词搜索 II(字典树,附上JS模板)

    仰望星空的人,不应该被嘲笑 题目描述 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成, ...

  5. LeetCode 208 实现 Trie (字典树)

    208 实现 Trie (字典树) 题目: 实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作. 示例: Trie trie = new Tri ...

  6. 数据结构与算法(十一)Trie字典树

    本文主要包括以下内容: Trie字典树的基本概念 Trie字典树的基本操作 插入 查找 前缀查询 删除 基于链表的Trie字典树 基于Trie的Set性能对比 LeetCode相关线段树的问题 Lee ...

  7. 数据结构之字典树Trie

    文章目录 Trie 字典树 前缀树 什么是Trie 基本概念 基本性质 应用场景 优点 手写一个trie Trie字典树的前缀查询 实现Trie(前缀树) LeetCode208 添加与搜索单词 - ...

  8. 『ACM--数据结构--字典树』信息竞赛进阶指南--Tire树

    主要不是讲实现,是分享代码! 啥是字典树: Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎 ...

  9. 七月集训(22,23)字典树,有序集合

    文章目录 1.LeetCode:1418. 点菜展示表 2.LeetCode:1032. 字符流 1.LeetCode:1418. 点菜展示表 原题链接 给你一个数组 orders,表示客户在餐厅中完 ...

最新文章

  1. parkAndCheckInterrupt
  2. 关于Windows平台下安装mysql软件
  3. css动画(transition/transform/animation)
  4. Vue项目启动后Error: Cannot find module ‘xxx’的解决方法
  5. [转载] PGPool介绍和安装经验
  6. Celery多个定时任务使用RabbitMQ,Queue冲突解决
  7. 开源压缩算法brotli_Google的Brotli压缩算法,C ++核心准则以及更多新闻
  8. Python分析年度爆款“网抑云”热评,看看哪些文案触动了你的内心世界?
  9. 麦马计算机科学 UBC工程,2020年UBC文书题目
  10. 如何商业智能平台BI的成本
  11. Python中的self和init
  12. 豪华版飞机大战系列(三)
  13. 视觉SLAM十四讲第三讲
  14. WIn10桌面美化(一)Rainmeter的使用
  15. 短信营销 (php示例)
  16. Android安全-应用沙盒简述
  17. 计算机视觉论文-2021-07-20
  18. 致程序员之家论坛的所有会员
  19. 极验接入教程纯html,在AspNetCore中使用极验做行为认证的验证流程
  20. 景安服务器 磁盘挂载 步骤教程

热门文章

  1. 历届蓝桥杯JavaC组真题标题
  2. 云客Drupal源码分析之网站维护模式
  3. 台式电脑计算机怎么用,台式电脑怎么设置定时关机
  4. 设备接入ONENET(3)STM32 + ESP8266(MQTT协议)接入云 :官方例程移植笔记(HAL+LL库)
  5. Android 9.0 禁用屏幕锁屏和修改默认输入法为谷歌输入法功能实现
  6. 基于php+mysql的村干部绩效考核系统
  7. 人工智能专家讲师培训老师叶梓:人工智能之最新NLP自然语言处理技术与实战-28
  8. exFAT 文件系统格式
  9. mplayer移植-迅为IMX6Q开发板
  10. 简述大数分解算法Pollard Rho和Pollard p-1