Я пытался решить задачу поиска слов здесь в литкоде. Кажется, Leetcode выдает ошибку для двух тестовых случаев:
board = [["a","a"]], word = "aa"
и для: board = [["a"]], word = "a"
Но следующий код, похоже, отлично работает в Google Colab для обоих этих тестовых случаев. Может кто-нибудь сможет указать точную причину? Вероятно, это результат разницы версий Python. Но что конкретно для меня является потерей! Заранее спасибо!
class Solution:
def exist2(self, board: List[List[str]], word: str, current_row, current_col,\
match_index=0,seen_cells=[]) -> bool:
if match_index==len(word):
return True
else:
for i in range(-1,2):
for j in range(-1,2):
if current_row+i>=0 and current_col+j>=0 and current_row+i<len(board)\
and current_col+j<len(board[0]) and\
board[current_row+i][current_col+j]==word[match_index] and\
(current_row+i,current_col+j) not in seen_cells\
and i+j!=-2 and i+j!=2:
match_index+=1
seen_cells.append((current_row+i,current_col+j))
if self.exist2(board, word, current_row+i, current_col+j,\
match_index,seen_cells):
return True
else:
seen_cells.remove((current_row+i,current_col+j))
current_row,current_col=seen_cells[-1]
return False
def exist(self, board: List[List[str]], word: str, current_row=0, current_col=0,\
match_index=0,seen_cells=[]) -> bool:
start_index=[]
for i in range(len(board)):
for j in range(len(board[0])):
if board[i][j]==word[0]:
start_index.append((i,j))
for ele in start_index:
if self.exist2(board, word, ele[0],ele[1]):
return True
return False
def main()
print(exist([["a","a"]],'a'))






С вашим кодом имеется несколько проблем.
Во-первых, вы полагаетесь на аргумент по умолчанию seen_cells, но существует только один экземпляр этого списка, который используется во всех вызовах exist2. Несколько тестовых случаев будут использовать одно и то же состояние, что вызывает проблемы, если в seen_cells есть кортежи из предыдущих вызовов exist2.
Вы также увеличиваете match_index на каждой итерации внутреннего цикла в exist2, хотя каждая итерация должна быть независимой. Вместо этого вам следует передать match_index + 1 рекурсивному вызову exist2.
Кроме того, вы разрешили диагональные ходы, только отметив i+j!=-2 and i+j!=2. Например, ход (-1, 1) разрешен, поскольку -1 + 1 = 0 не равен ни -2, ни 2. Правильно было бы проверить, что ровно одно из i и j не равно нулю. Это можно сделать кратко с помощью ((not i) ^ (not j)), но можно и более подробно.
Кроме того, вы не добавляете первую ячейку пути к seen_paths. Вы можете исправить эту ошибку отклонения на единицу, проверив совпадение прямо в начале exist2 и удалив его из seen_cells прямо перед возвратом. Обратите внимание, что строка current_row,current_col=seen_cells[-1] не имеет особого смысла и может вызывать IndexError; убери это.
Наконец, это решение слишком медленное, поскольку проверка наличия в списке — это операция с линейным временем. Вместо этого используйте set или логическую матрицу, чтобы отметить, какие ячейки уже были пройдены.