栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

LeetCode 题集:字典树

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode 题集:字典树

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


208. Implement Trie (Prefix Tree)(实现 Trie (前缀树))
问题描述

思路与代码

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

代码如下:

class Trie:

    def __init__(self):
        self.trie = {}

    def insert(self, word: str) -> None:
        cur = self.trie
        for c in word:
            if c not in cur.keys():
                cur[c] = {}
            cur = cur[c]
        cur['$'] = True

    def search(self, word: str) -> bool:
        cur = self.trie
        for c in word:
            if c not in cur.keys():
                return False

            cur = 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.trie
        for c in prefix:
            if c not in cur.keys():
                return False

            cur = 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.dictionary
        for 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 iterable

    def search(self, word: str) -> bool:
        def rec(dic: Dict, i: int):  # recursion function
            if i == len(word):
                return '$' in dic.keys()

            if word[i] == '.':
                for letter in dic.keys():
                    if rec(dic=dic[letter], i=i + 1):
                        return True
                return False

            elif word[i] not in dic.keys():
                return False

            else:
                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 trie
        dictionary = {}
        for word in words:
            dic = dictionary
            for c in word:
                if c not in dic.keys():
                    dic[c] = {}
                dic = dic[c]
            dic['$'] = True

        res = []

        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] = True

            if 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] = False

            if 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] = False

            if 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] = False

            if 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] = False

        for 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

运行效果:


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/461380.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号