Рекурсивный поиск с возвратом — поиск слов в двумерном массиве

Я пытался решить задачу поиска слов здесь в литкоде. Кажется, 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'))
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С вашим кодом имеется несколько проблем.

Во-первых, вы полагаетесь на аргумент по умолчанию 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 или логическую матрицу, чтобы отметить, какие ячейки уже были пройдены.

Пример реализации
Unmitigated 11.05.2024 20:16

Другие вопросы по теме