79. leetcode búsqueda de la palabra (Python)

Aquí Insertar imagen Descripción
Solución:
Este problema es un problema de búsqueda de recorrido, que puede ser resuelto por el retroceso algoritmo.

  1. En este problema, necesitamos para cada celda de la cuadrícula de dos dimensiones y atravesar para encontrar una palabra coincidente;
    primero creamos un bucle para atravesar el suelo de cada célula;
    código como sigue:
class Solution:
    def exist(self, board, word):

        #设置数组中的元素只能被使用一次
        used = [[False] * len(board[0]) for i in range(len(board))]
        # print(used)


        for i in range(len(board)):
            for j in range(len(board[0])):

                if(self.dfs_search(board, i, j,word,0,len(word) - 1)):
                    return True
        return False
  1. Al mismo tiempo, se mueve dentro de la red, podemos encontrar letra de dirección y la palabra en un partido (en la práctica necesidad de excluir llegó a esta posición en cuatro direcciones, sólo tres direcciones; pero esto tenemos que escribir el código de excluir, y la dirección de cada elemento a ser excluida cuando se mira diferente, por lo que todavía código de escritura en cuatro direcciones)
    código es el siguiente:
    def dfs_search(self, board, x, y, word,index,length_word):

        if board[x][y] != word[0]:
            return False

        #递归终止条件
        if index == length_word:
            return True

        #四个方向进行遍历
        # print(x,y)
        # print(word[0])
        # print('index,',index)
        # print('word',len(word) - 1)
        # if board[x][y] == word[0]:

            # used[x][y] = True
        tmp = board[x][y]
        board[x][y] = 0


        #向下遍历
        if (x < len(board) - 1 and self.dfs_search(board, x + 1, y, word[1:],index + 1,length_word)) or \
            (y < len(board[0]) - 1 and self.dfs_search(board, x, y + 1, word[1:],index + 1,length_word)) or \
            (x > 0 and self.dfs_search(board, x - 1, y, word[1:], index + 1,length_word)) or \
            (y > 0 and self.dfs_search(board, x, y - 1, word[1:], index + 1,length_word)):

                    return True
        


        board[x][y] = tmp


        return False
  1. En el código anterior se realizó tmp = bordo [x] [y], tablero [x] [y] = operador de 0, es prevenir accesos repetidos, es decir, después de entrar en dfs recursión, si las visitas repetidas, la Junta [ ! x] [y] = palabra [0], volverá inmediatamente; a establecer una operación de acceso reduce el tamaño de la matriz y el mismo tablero, para mejorar la complejidad espacial y temporal;
  2. Y si durante el proceso de dar marcha atrás, si no se encuentran cuatro direcciones, tenemos que dar marcha atrás, devolver un recursivo, recursiva ante un cambio, necesitamos restaurar el estado, tenemos que establecer la junta [x] [y ] = tmp.
  3. Debido a este problema es encontrar un camino para volver verdadero después del partido, por lo tanto, si cualquier condición es verdadera; podemos volver inmediatamente verdadera; retorno a través de capas de recursividad, existiendo función devuelve verdadero;
  4. Mientras que atraviesa la red para encontrar un camino, la función retorna verdadero es verdadero; y toda la red atravesado son falsas, devuelve falso.

El código completo:

class Solution:
    def exist(self, board, word):

        #设置数组中的元素只能被使用一次
        used = [[False] * len(board[0]) for i in range(len(board))]
        # print(used)


        for i in range(len(board)):
            for j in range(len(board[0])):

                if(self.dfs_search(board, i, j,word,0,len(word) - 1)):
                    return True
        return False





    def dfs_search(self, board, x, y, word,index,length_word):

        if board[x][y] != word[0]:
            return False

        #递归终止条件
        if index == length_word:
            return True

        #四个方向进行遍历
        # print(x,y)
        # print(word[0])
        # print('index,',index)
        # print('word',len(word) - 1)
        # if board[x][y] == word[0]:

            # used[x][y] = True
        tmp = board[x][y]
        board[x][y] = 0


        #向下遍历
        if (x < len(board) - 1 and self.dfs_search(board, x + 1, y, word[1:],index + 1,length_word)) or \
            (y < len(board[0]) - 1 and self.dfs_search(board, x, y + 1, word[1:],index + 1,length_word)) or \
            (x > 0 and self.dfs_search(board, x - 1, y, word[1:], index + 1,length_word)) or \
            (y > 0 and self.dfs_search(board, x, y - 1, word[1:], index + 1,length_word)):

                    return True
        


        board[x][y] = tmp


        return False

Aquí Insertar imagen Descripción
También registra cuál es el proceso de CA a esta pregunta:
En primer lugar, el método es relativamente fácil pensar en la creación de una matriz del mismo tamaño y comida, para registrar si se accede a cada célula; complejidad del tiempo es alta, pero fácil de entender:

class Solution:
    def exist(self, board, word):

        #设置数组中的元素只能被使用一次
        used = [[False] * len(board[0]) for i in range(len(board))]
        # print(used)


        for i in range(len(board)):
            for j in range(len(board[0])):

                if(self.dfs_search(board, i, j,word,0,len(word) - 1,[[False] * len(board[0]) for i in range(len(board))])):
                    return True
        return False





    def dfs_search(self, board, x, y, word,index,length_word,used):

        #递归终止条件
        if index == length_word and board[x][y] == word[0]:
            return True

        #四个方向进行遍历
        # print(x,y)
        # print(word[0])
        # print('index,',index)
        # print('word',len(word) - 1)
        if board[x][y] == word[0]:

            used[x][y] = True


            #向下遍历
            if x < len(board) - 1:
                if used[x + 1][y] == False:

                    if(self.dfs_search(board, x + 1, y, word[1:],index + 1,length_word,used)):

                        return True
                    # else:
                    #     #回溯过程中设置未访问
                    #     used[x][y] = False


            #向右遍历
            if y < len(board[0]) - 1:
                # print("###")
                # print(x,y+1)
                if used[x][y + 1] == False:

                    if(self.dfs_search(board, x, y + 1, word[1:],index + 1,length_word,used)):

                        return True
                    # else:

                    #     used[x][y] = False
            #向上遍历
            if x > 0:
                if used[x - 1][y] == False:

                    if(self.dfs_search(board, x - 1, y, word[1:], index + 1,length_word,used)):
                        return True

                    # else:

                    #     used[x][y] = False
            #向左遍历
            if y > 0:
                if used[x][y - 1] == False:
                    if(self.dfs_search(board, x, y - 1, word[1:], index + 1,length_word,used)):
                        return True

                    # else:

                    #     used[x][y] = False
            
            used[x][y] = False

            return False


        else:

            return False

Aquí Insertar imagen Descripción
Después de leer las explicaciones, se optimiza su método, que se utiliza para eliminar la matriz;
código como sigue:

class Solution:
    def exist(self, board, word):

        #设置数组中的元素只能被使用一次
        used = [[False] * len(board[0]) for i in range(len(board))]
        # print(used)


        for i in range(len(board)):
            for j in range(len(board[0])):

                if(self.dfs_search(board, i, j,word,0,len(word) - 1)):
                    return True
        return False





    def dfs_search(self, board, x, y, word,index,length_word):
        if board[x][y] != word[0]:
            return False

        #递归终止条件
        if index == length_word:
            return True

        #四个方向进行遍历
        # print(x,y)
        #print(word[0])
        #print('index,',index)
        #print('word',len(word) - 1)
        # if board[x][y] == word[0]:

            # used[x][y] = True
        tmp = board[x][y]
        board[x][y] = 0


        #向下遍历
        if x < len(board) - 1:
            # if used[x + 1][y] == False:

                if(self.dfs_search(board, x + 1, y, word[1:],index + 1,length_word)):

                    return True
                # else:
                #     #回溯过程中设置未访问
                #     used[x][y] = False


        #向右遍历
        if y < len(board[0]) - 1:
            # print("###")
            # print(x,y+1)
            # if used[x][y + 1] == False:

                if(self.dfs_search(board, x, y + 1, word[1:],index + 1,length_word)):

                    return True
                # else:

                #     used[x][y] = False
        #向上遍历
        if x > 0:
            # if used[x - 1][y] == False:

                if(self.dfs_search(board, x - 1, y, word[1:], index + 1,length_word)):
                    return True

                # else:

                #     used[x][y] = False
        #向左遍历
        if y > 0:
            # if used[x][y - 1] == False:
                if(self.dfs_search(board, x, y - 1, word[1:], index + 1,length_word)):
                    return True

                # else:

                #     used[x][y] = False

        board[x][y] = tmp


        return False

Aquí Insertar imagen Descripción
Si la defensa de cuatro en uno, el primer código es el comienzo, el tiempo requerido mínimo.

Publicados 100 artículos originales · ganado elogios 3 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/cy_believ/article/details/104544369
Recomendado
Clasificación