本文介绍 LeetCode 题集中,有关字典树的问题。

208. Implement Trie (Prefix Tree)(实现 Trie (前缀树))

问题描述

思路与代码

本题是基本的字典树问题,使用 Python 语言中的字典类型实现比较方便。

代码如下:

class Trie:def __init__(self):self.trie = {}def insert(self, word: str) -> None:cur = self.triefor c in word:if c not in cur.keys():cur[c] = {}cur = cur[c]cur['$'] = Truedef search(self, word: str) -> bool:cur = self.triefor c in word:if c not in cur.keys():return Falsecur = cur[c]return '$' in cur.keys()  # word must be the end of the tree, not just "start with"def startsWith(self, prefix: str) -> bool:cur = self.triefor c in prefix:if c not in cur.keys():return Falsecur = cur[c]return True# Your Trie object will be instantiated and called as such:
# obj = Trie()
# obj.insert(word)
# param_2 = obj.search(word)
# param_3 = obj.startsWith(prefix)

运行效果:

211. Design Add and Search Words Data Structure(添加与搜索单词 - 数据结构设计)

问题描述

思路与代码

本题与前一题相似,区别在于任意字符的匹配。

代码如下:

class WordDictionary:def __init__(self):self.dictionary = {}def addWord(self, word: str) -> None:cur = self.dictionaryfor c in word:if c not in cur.keys():cur[c] = {}cur = cur[c]cur['$'] = {}  # can't be True like LeetCode 208, need to be iterabledef search(self, word: str) -> bool:def rec(dic: Dict, i: int):  # recursion functionif i == len(word):return '$' in dic.keys()if word[i] == '.':for letter in dic.keys():if rec(dic=dic[letter], i=i + 1):return Truereturn Falseelif word[i] not in dic.keys():return Falseelse:return rec(dic=dic[word[i]], i=i + 1)return rec(dic=self.dictionary, i=0)# Your WordDictionary object will be instantiated and called as such:
# obj = WordDictionary()
# obj.addWord(word)
# param_2 = obj.search(word)

运行效果:

212. Word Search II(单词搜索 II)

问题描述


思路与代码

本题的思路,把单词列表写成字典树,然后在字母矩阵的不同路径的每个位置搜索是否存在当前单词。

代码如下:

class Solution:def findWords(self, board: List[List[str]], words: List[str]) -> List[str]:# create a triedictionary = {}for word in words:dic = dictionaryfor c in word:if c not in dic.keys():dic[c] = {}dic = dic[c]dic['$'] = Trueres = []m, n = len(board), len(board[0])def dfs(row: int, column: int, dic: Dict, path: str):if '$' in dic.keys() and path not in res:res.append(path)mat_visit[row][column] = Trueif row:if not mat_visit[row - 1][column] and board[row - 1][column] in dic.keys():dfs(row=row - 1, column=column, dic=dic[board[row - 1][column]], path=path + board[row - 1][column])mat_visit[row - 1][column] = Falseif row < m - 1:if not mat_visit[row + 1][column] and board[row + 1][column] in dic.keys():dfs(row=row + 1, column=column, dic=dic[board[row + 1][column]], path=path + board[row + 1][column])mat_visit[row + 1][column] = Falseif column:if not mat_visit[row][column - 1] and board[row][column - 1] in dic.keys():dfs(row=row, column=column - 1, dic=dic[board[row][column - 1]], path=path + board[row][column - 1])mat_visit[row][column - 1] = Falseif column < n - 1:if not mat_visit[row][column + 1] and board[row][column + 1] in dic.keys():dfs(row=row, column=column + 1, dic=dic[board[row][column + 1]], path=path + board[row][column + 1])mat_visit[row][column + 1] = Falsefor i in range(m):for j in range(n):mat_visit = [[False for _ in range(n)] for _ in range(m)]if board[i][j] in dictionary.keys():dfs(row=i, column=j, dic=dictionary[board[i][j]], path=board[i][j])return res

运行效果:

LeetCode 题集:字典树相关推荐

  1. 经典算法题:字典树、并查集、单调栈、二分、带标记函数dp、树、全排列、字符串问题等常用算法

    0. Tips 1. 位运算 如何枚举一个二进制状态数字k的子集, 方法就是针对中的二进制为1的位开始进行减法,判断数字k的二进制子集, 像枚举(2^k-1) ~ 0一样枚举其子集: int sub ...

  2. 【leetcode】JS 字典树 建树 查找键 查找键前缀【模板】

    var findWords = function(grid, words) {// 存放最终结果集let res = []// 字典树节点class TrieNode {constructor(){t ...

  3. LeetCode 题集:排序

    本文介绍 LeetCode 题集中,有关排序的问题. 215. Kth Largest Element in an Array(数组中的第K个最大元素) 问题描述 思路与代码 解决本题时,笔者想到了一 ...

  4. 【山无遮,海无拦】LeetCode题集 线性枚举之最值算法

    目录 1464.数组中两元素的最大乘积 法一:线性扫描 法二:排序 485. 最大连续 1 的个数 法一:线性扫描 153. 寻找旋转排序数组中的最小值 法一:线性扫描 法二:二分法 154. 寻找旋 ...

  5. LeetCode题集大全

    LeetCode 01. 两数之和 LeetCode 02.两数相加 LeetCode 03. 无重复字符的最长子串 LeetCode 07. 整数反转 Leetcode 08. 字符串转换整数 (a ...

  6. LeetCode题集 —— 调整数组顺序使奇数位于偶数前面 + 移动零

    目录 题目:分离奇偶数 解法一:菜鸟级 解法二:头尾指针 解法三:快慢指针 再次优化解法三: 举一反三:解题:移动零 解法一:快慢指针 解法二: 题目:分离奇偶数 输入一个整数数组,实现一个函数来调整 ...

  7. 提高篇 第二部分 字符串算法 第3章 Trie字典树

    Trie(字典树)解析及其在编程竞赛中的典型应用举例 - Reqaw - 博客园 『一本通』Trie字典树 - YeLingqi - 博客园 字典树(Trie Tree) - 仰望高端玩家的小清新 - ...

  8. 字典树,01字典树,可持续化01字典树(总结+例题)

    目录 字典树 01字典树 字典树例题: power oj 2390: 查单词 HDU 1671 Phone List HDU 1004Let the Balloon Rise HDU 1075 Wha ...

  9. C#LeetCode刷题-字典树

    字典树篇 # 题名 刷题 通过率 难度 208 实现 Trie (前缀树) 48.6% 中等 211 添加与搜索单词 - 数据结构设计 39.9% 中等 212 单词搜索 II 27.9% 困难 33 ...

最新文章

  1. linux下access函数的应用
  2. python官网下载好慢1001python官网下载好慢-Python|时间复杂度测试
  3. 三相pmsm矢量控制仿真模型_低载波比工况下永磁同步电机磁链矢量轨迹分析
  4. Python爬虫Scrapy框架IP代理的配置与调试
  5. alwayson10-创建alwayson高可用性组侦听器
  6. sqlserver2005查询表字典
  7. VScode:创建用户代码片段
  8. matlab按图像边缘抠图_干货:PS抠图的九种方法,最后一个简直是万能
  9. 汽车维修企业管理【1】
  10. 微信小程序项目-出租屋管理系统
  11. 由简入难学习3d机械制图软件顺序?Pro/Engineer 与CREO有何不同。
  12. 色谱计算机常用英文,色谱术语的常用中英文对照
  13. quartz定时器表达式详解
  14. Word删除单独页页眉与分节处理
  15. 【运筹优化】元启发式算法详解:模拟退火算法(Simulated Annealing,SA)+ 案例讲解代码实战
  16. matlab 设置position 位置 /xlabel/legend位置的设置方式
  17. 水文章(bushi)
  18. android下面res目录
  19. Could not find a version of package tomorrow-sky/test matching your minimum-stability (stable)
  20. 0818骑行仙湖绿道

热门文章

  1. select * from t_student where class between 200 and 300需要执行几次索引树的搜索操作,会扫描多少行
  2. linux dd 尾部添加0,Linux命令dd的使用帮助 | Soo Smart!
  3. 关于计算机二级的论文5000字,计算机二级论文
  4. 云计算中的 10 种虚拟化类型
  5. 服务器安装红旗linux,在服务器redflag 6.0中怎么安装红旗Linux 桌面版
  6. 2007中国手机客户端软件TOP50
  7. 双线机房和双线双IP机房的区别
  8. 5.4呈献:HP-Socket v5.3.1 支持 Android NDK
  9. 8个Python工具,用来做应用程序开发真的很好用
  10. IO流案例-熊猫烧香