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

使用trie的leetcode 212 word search II bug

劳英华
2023-03-14

问题:给定一个m x n的字符板和一个字符串单词列表,返回板上的所有单词。

class Solution(object):
    def findWords(self, board, words):
        WORD_KEY = '$'
        trie = {}
        for word in words:
            node = trie
            for letter in word:
                # retrieve the next node; If not found, create a empty node.
                node = node.setdefault(letter, {})
            # mark the existence of a word in trie node
            node[WORD_KEY] = word
        
        rowNum = len(board)
        colNum = len(board[0])
        
        matchedWords = []
        
        def helper(row,col,trie):
            if trie.keys()[0]==WORD_KEY:
                matchedWords.append(trie[WORD_KEY])
                return
            if row>len(board)-1 or row<0 or col>len(board[0])-1 or col<0:
                return
            if board[row][col] == '*':
                return
            if board[row][col] in trie:
                for (rowOffset, colOffset) in [(-1, 0), (0, 1), (1, 0), (0, -1)]:
                    temp=board[row][col]
                    board[row][col]='*'
                    helper(row+rowOffset,col+colOffset,trie[temp])
                    board[row][col]=temp
            else:
                return
         
        for i in range(len(board)):
            for j in range(len(board[0])):
                helper(i,j,trie) 
        return matchedWords             

递归一直是我最大的问题,很难找到错误,我想知道我是如何在代码中出错的。错误的输出如下:[“誓言”,“誓言”,“誓言”,“誓言”,“吃”,“吃”,“吃”,“吃”,“吃”],每个重复4次

而不仅仅是[宣誓,吃饭]

共有1个答案

陆和泰
2023-03-14

这是一个有效的方法--它纠正了helper函数中的一些问题:

def backtracking(row, col, parent):    
    letter = board[row][col]
    currNode = parent[letter]
            
    word_match = currNode.pop(WORD_KEY, False)
    if word_match:
       matchedWords.append(word_match)
            
       board[row][col] = '#'   # marked as visited already
            
       # Explore the neighbors in 4 directions
       for (rowOffset, colOffset) in [(-1, 0), (0, 1), (1, 0), (0, -1)]:
            newRow, newCol = row + rowOffset, col + colOffset     
            if newRow < 0 or newRow >= rowNum or newCol < 0 or newCol >= colNum:
                 continue
            if not board[newRow][newCol] in currNode:
                 continue
            backtracking(newRow, newCol, currNode)
        
        board[row][col] = letter   # end of Exploration, restore it
        
        #remove the matched leaf node in Trie.
        if not currNode:  parent.pop(letter)

    for row in range(rowNum):
        for col in range(colNum):
            if board[row][col] in trie:
                backtracking(row, col, trie)
        
    return matchedWords
 类似资料:
  • 问题内容: 我试图实现一个帕特里夏特里结构的方法,以及作为一种手段来存储大字典中的字进行快速检索(包括前缀搜索)的。我已经阅读了这些概念,但是并没有明确说明它们的实现。我想知道(用Java或Python代码)如何实现Trie,特别是节点(或者我应该递归实现)。我看到一个人用将26个子节点设置为null / None来实现它。有没有更好的策略(例如将字母当作位),您将如何实现呢? 问题答案: 有人问

  • 问题内容: 我想在Java中使用Trie,有没有可以使用的实现?(我尝试寻找一个,但没有找到)。 问题答案: 核心Java库中没有trie数据结构。 这可能是因为尝试通常被设计为存储字符串,而Java数据结构更通用,通常包含任何字符串(定义相等性和哈希操作),尽管有时它们限于 对象(定义顺序)。尽管适用于字符串,但没有通用的“符号序列”抽象,我想您可以为其他类型的符号做些事情。 这是要考虑的另一点

  • 我正在实现一个植入拼写词典的trie。trie的基本元素是一个trienode,它由一个字母部分(char)、一个标志(这个char是否是单词的最后一个char)和一个由26个指针组成的数组组成。 TrieNode类的私有部分包括: 这是测试调用的一部分: 现在,我正在尝试遍历trie以计算有多少单词(有多少标志被设置为true)。 每次函数返回0。我知道这是因为当数组中的第一个元素为null时,

  • 问题内容: 是否有任何库或文档/链接提供了有关在Java中实现Trie数据结构的更多信息? 任何帮助将是巨大的! 谢谢。 问题答案: 您可以阅读Java Trie 或查看trie。