我目前正在try 解决leetcode上的问题Add and Search Words Data Structure.问题如下:

设计一个支持添加新词和查找if的数据 struct 字符串与以前添加的任何字符串匹配.

实现WordDictionary类:

WordDictionary()用于初始化对象.

void addWord(word)word添加到数据 struct 中,稍后可以进行匹配.

如果数据 struct 中有任何匹配的字符串,则bool search(word)返回true wordfalse,否则.单词可以包含点.,其中点可以 与任何字母都匹配.

My Strategy:

我的策略包括用哈希图表示Trie,而不是传统的基于链表的树 struct ,旨在提高性能和降低复杂性.通过使用哈希图,我们可以快速访问下一个 node ,而无需遍历不必要的 node ,从而使操作速度更快,尤其是在处理大型数据集时.

例如,在这种 struct 中插入苹果和应用程序等词时,它被组织为嵌套的哈希图,其中一个词中的每个字符指向代表下一个字符的另一个哈希图.单词的末尾使用特殊的键值对{‘end’:{}}进行标记.这样,我们以最小的空间和时间复杂度高效地存储和搜索单词.

My Code:

class WordDictionary(object):

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

    def addWord(self, word):
        """
        :type word: str
        :rtype: None
        """
        current = self.map
        for i in word:
            if i in current:
                current = current[i]
            else:
                current[i] = {}
                current = current[i]
        current['end'] = {}
        
        return
        

    def search(self, word):
        """
        :type word: str
        :rtype: bool
        """
        current = self.map
        for i in word:
            if i in current:
                current = current[i]
            elif i == '.':
                current = {key: value for d in current.values() for key, value in d.items()}
            else:
                return False
        if 'end' in current:
            return True
        return False

该解决方案似乎对大多数情况都有效,但我遇到了test case 16的错误,它没有给出正确的结果.测试用例16的长度使得确定错误发生在哪里特别具有挑战性.我需要一些指导来追踪fix this logical error号公路.你能帮忙解决这件事吗?

推荐答案

Trie中的搜索与二进制搜索的一个共同点是,它不断缩小范围之间的可能性;不同的是,它是逐个字符搜索,而不是二进制搜索,它使用的不是二进制中间的位置,而是单词中的位置.(它仍然使用log n iid执行,请参见Tong2016Smoothed.)

然而,当涉及到通配符(.)时,人们不能添加可能性并并行地执行它们.一般来说,我们在输出中会有空洞,这样它就不会在单个范围内表示.例如,当搜索{cat, cel, cut}中的c.t时,包括catcut,但不包括中间的cel.我想我已经修改了这段代码,通过采用多个路径来实现这一点.

class WordDictionary(object):

    def __init__(self):
        self.node = None
        self.map = {}

    def __repr__(self):
        if self.node and self.map:
            return "\"{0}\".{1}".format(self.node, self.map)
        elif self.node:
            return "\"{0}\"".format(self.node)
        elif self.map:
            return "∅.{0}".format(self.map)
        else:
            return "<error>"

    def addWord(self, word: str) -> None:
        current = self
        for i in word:
            if not i in current.map:
                current.map[i] = WordDictionary()
            current = current.map[i]
        current.node = word

    def match(self, word: str) -> str:
        if not word:
            """
            in-order sub-trie traversal will enumerate the words that have
            `word` as a prefix (hence prefix-tree); (not used)
            """
            if self.node:
                yield self.node
            return
        i = word[0]
        rest = word[1:]
        if i == '.':
            for wild in self.map.values():
                yield from wild.match(rest)
        elif i in self.map:
            yield from self.map[i].match(rest)

    def search(self, word: str) -> bool:
        return next(self.match(word), None) != None

words = WordDictionary()
words.addWord("zulu")
words.addWord("november")
words.addWord("mike")
words.addWord("yankee")
words.addWord("cat")
words.addWord("cate")
words.addWord("cel")
words.addWord("cut")
words.addWord("cute")
print("words: {0}".format(words))

print("first match a:", next(words.match("a"), None))
print("first match mi..:", next(words.match("mi.."), None))
print("search a:", words.search("a"))
print("search c.t:", words.search("c.t"))
print("search z.lu:", words.search("z.lu"))
print("search mi..:", words.search("mi.."))
print("search ..:", words.search(".."))
print("search ....:", words.search("...."))
print("search c.te", words.search("c.te"))

match函数是一个(递归)生成器,用于生成所有可能使用带通配符的字符串的单词.self.node字符串是end sentinel的一种更有表现力的形式; end也可以使用,但我编写search的方式要求从match返回任何单词.(第python3章不是我的错,这不是我的错)

Python相关问答推荐

Select 用a和i标签包裹的复选框?

Deliveryter Notebook -无法在for循环中更新matplotlib情节(保留之前的情节),也无法使用动画子功能对情节进行动画

Python上的Instagram API:缺少client_id参数"

将输入管道传输到正在运行的Python脚本中

无法通过python-jira访问jira工作日志(log)中的 comments

为什么默认情况下所有Python类都是可调用的?

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

avxspan与pandas period_range

我对我应该做什么以及我如何做感到困惑'

NumPy中条件嵌套for循环的向量化

用砂箱开发Web统计分析

在pandas数据框中计算相对体积比指标,并添加指标值作为新列

在输入行运行时停止代码

Python Pandas—时间序列—时间戳缺失时间精确在00:00

替换现有列名中的字符,而不创建新列

Pythonquests.get(Url)返回Colab中的空内容

.awk文件可以使用子进程执行吗?

奇怪的Base64 Python解码

正则表达式反向查找

`Convert_time_zone`函数用于根据为极点中的每一行指定的时区检索值