ошибки leetcode 212 word search II с использованием trie

#algorithm #recursion #backtracking

#алгоритм #рекурсия #отслеживание возврата

Вопрос:

Проблема: учитывая таблицу символов m x n и список строк words, верните все слова на доске.

Каждое слово должно быть построено из букв последовательно смежных ячеек, где соседние ячейки соседствуют по горизонтали или вертикали. Одна и та же буквенная ячейка не может использоваться более одного раза в слове. введите описание изображения здесьВот мое решение:

 class Solution(object):
    def findWords(self, board, words):
        WORD_KEY = '

Рекурсия всегда является моей самой большой проблемой, и трудно найти ошибку, я хочу знать, как я ошибаюсь в своем коде. Ниже приведен неправильный вывод:
["клятва", "клятва", "клятва", "клятва", "есть", "есть","есть","есть"], каждый повторяется 4 раза

вместо просто [клятва, ешь]


Комментарии:

1. было бы лучше, если бы вы также добавили сюда описание проблемы..

2. это кодовый номер 212, leetcode.com/problems/word-search-ii

3. @bot99zjc добавьте описание проблемы к вопросу, а не добавляйте к нему ссылку

4. @bot99zjc в вашей программе есть некоторые проблемы, в том числе последнее утверждение выявило проблему с форматированием. Пожалуйста, проверьте мой пересмотренный вариант в сообщении.

5. @DanielHao где именно проблема моего кода?

Ответ №1:

Это рабочий - он исправил некоторые проблемы в 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
 

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. было бы лучше, если бы вы также добавили сюда описание проблемы..

2. это кодовый номер 212, leetcode.com/problems/word-search-ii

3. @bot99zjc добавьте описание проблемы к вопросу, а не добавляйте к нему ссылку

4. @bot99zjc в вашей программе есть некоторые проблемы, в том числе последнее утверждение выявило проблему с форматированием. Пожалуйста, проверьте мой пересмотренный вариант в сообщении.

5. @DanielHao где именно проблема моего кода?

Ответ №1:

Это рабочий — он исправил некоторые проблемы в helper функции: