当前位置: 首页 > 知识库问答 >
问题:

Trie树在词搜索中的匹配性能

潘哲
2023-03-14

给出一个二维板和字典中的单词列表,找出板中的所有单词。

每个单词必须由顺序相邻单元格的字母构成,其中“相邻”单元格是那些水平或垂直相邻的单元格。同一个字母单元格在一个单词中不能使用不止一次。

例如,给定单词=[“誓言”、“豌豆”、“吃”、“雨”]和board=

[
  ['o','a','a','n'],
  ['e','t','a','e'],
  ['i','h','k','r'],
  ['i','f','l','v']
]

回归[“吃”“誓”]

class TrieNode():
    def __init__(self):
        self.children = collections.defaultdict(TrieNode)
        self.isWord = False

class Trie():
    def __init__(self):
        self.root = TrieNode()

    def insert(self, word):
        node = self.root
        for w in word:
            node = node.children[w]
        node.isWord = True

    def search(self, word):
        node = self.root
        for w in word:
            node = node.children.get(w)
            if not node:
                return False
        return node.isWord

class Solution(object):
    def findWords(self, board, words):
        res = []
        trie = Trie()
        node = trie.root
        for w in words:
            trie.insert(w)
        for i in xrange(len(board)):
            for j in xrange(len(board[0])):
                self.dfs(board, node, i, j, "", res)
        return res

    def dfs(self, board, node, i, j, path, res):
        if node.isWord:
            res.append(path)
            node.isWord = False
        if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]):
            return 
        tmp = board[i][j]
        node = node.children.get(tmp)
        if not node:
            return 
        board[i][j] = "#"
        self.dfs(board, node, i+1, j, path+tmp, res)
        self.dfs(board, node, i-1, j, path+tmp, res)
        self.dfs(board, node, i, j-1, path+tmp, res)
        self.dfs(board, node, i, j+1, path+tmp, res)
        board[i][j] = tmp

共有1个答案

姜钧
2023-03-14

我在代码中的trie部分没有看到任何错误。

但我认为Trie的原始设计已经在检测到任何不匹配时提前返回。

实际上,我通常只使用常规的dict作为trie,而不是defaultdict+trienode,以避免使问题过于复杂。如果某个节点是有效的单词,则只需设置“#”键。并且,在插入过程中,只需执行节点[w]={}

 类似资料:
  • 问题内容: 我想搜索包含许多单词的字符串,并检索与其中任何一个匹配的文档。我的索引方法如下: 这是我的搜索方法。我不想寻找特定的词组,但是其中的任何单词。用于搜索的分析器与用于索引的分析器相同。 我是Lucene的新手。有人可以帮我吗? 问题答案: 使用会精确地尝试将短语“单词列表”与短语坡度0匹配。 如果要匹配单词列表中的 任何 术语,可以使用: 或者,您也可以使用,以便您可以要求查询词的数量的

  • 问题内容: 我正在执行模糊搜索,需要查看匹配的单词。例如,如果我正在搜索查询,并且它使该字段与句子匹配,则我需要能够知道匹配是由于单词引起的。 我尝试设置参数,但似乎未包含我需要的信息。有什么想法吗? 问题答案: 好吧,这就是我想要的: 经过一些研究,我发现了elasticsearch的突出功能。 默认情况下,它返回匹配项周围的上下文片段,但是您可以将片段大小设置为查询长度,以仅返回完全匹配项。例

  • 我需要实现的是基于单个字段(产品名称,基本上由所有可能的筛选器值组成)来匹配文档。我知道这不是最可靠的解决方案,但我只有这一个领域可以使用。 我需要能够发送搜索查询,并将该查询中的单词以任何顺序匹配到name字段(名称应包含搜索查询中的所有单词)。实际上,在这一点上,简单的效果很好,但是那里缺少的是模糊。因为我们需要的另一件事是允许用户做一些拼写错误,并且仍然获得相关的结果。 我的问题是,有没有什

  • 有没有办法在elasticsearch中查询一组术语的相似性(匹配分数)? 简单的例子: 数据: 查询: 后果 说明:doc1包含搜索中存在的所有标记。doc2包含搜索中存在的3个标记中的2个 所以基本上查询将返回按匹配排序的文档列表,其中匹配=文档中的标签与查询中的标签有多相似。不需要模糊性。返回%只是一个例子,返回点或其他单位就可以了。标签的数量可以不同。 我正在设计系统,因此可以以任何格式存

  • 我在列表中有这样的数据: 我当前的解决方案能够检测到完全匹配的重复项。因此,它当前将输出: 我想增加一些可能性,以便它们也在输出列表中: 下面是我当前的代码: 我将非常感谢任何善意的建议,以导致实现这种检查的解决办法?我个人认为这里没有任何可能的合乎逻辑的解决办法?也许只是某种基于分数的Levenshtein距离计算和检测?如果这是不可能的,将是有益的,至少得到这些(匹配多个单词,例如两个):

  • 我希望与字段中的字符串完全匹配,然后返回一天,提取所有此类记录。我所使用的json似乎也与简单的单词相匹配。我不确定我哪里出了问题。我需要向这个查询JSON添加吗?我目前拥有的JSON如下所示: