Leetcode練習(Python):數組類:第79題:給定一個二維網格和一個單詞,找出該單詞是否存在於網格中。 單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重復使用。


題目:

給定一個二維網格和一個單詞,找出該單詞是否存在於網格中。

單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重復使用。

思路:

深度優先和回溯法結合

程序1:

class Solution(object):
    
    directs = [(0, 1), (0, -1), (1, 0), (-1, 0)]
    
    def exist(self, board: List[List[str]], word: str) -> bool:
        row = len(board)
        if row == 0:
            return False
        column = len(board[0])
        visited = [[0 for _ in range(column)] for _ in range(row)]          
        for index1 in range(len(board)):
            for index2 in range(len(board[0])):
                if board[index1][index2] == word[0]:
                    visited[index1][index2] = 1
                    if self.backtrack(index1, index2, visited, board, word[1:]) == True:
                        return True
                    else:
                        visited[index1][index2] = 0
        return False     
    def backtrack(self, i, j, visited, board, word):
        if len(word) == 0:
            return True
        for direct in self.directs:
            cur_i = i + direct[0]
            cur_j = j + direct[1]
            if cur_i >= 0 and cur_i < len(board) and cur_j >= 0 and cur_j < len(board[0]) and board[cur_i][cur_j] == word[0]:
                if visited[cur_i][cur_j] == 1:
                    continue
                visited[cur_i][cur_j] = 1
                if self.backtrack(cur_i, cur_j, visited, board, word[1:]) == True:
                    return True
                else:
                    visited[cur_i][cur_j] = 0
        return False
程序2:代碼更簡潔
class Solution:
    def exist(self, board: List[List[str]], word: str) -> bool:
        for index1 in range(len(board)):
            for index2 in range(len(board[0])):
                if self.dfs(board, index1, index2, word)  == True:
                    return True
        return False
    
    
    def dfs(self, board, i, j, word):
        if len(word) == 0:  
            return True
        if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]) or board[i][j] != word[0]:
            return False
        tmp = board[i][j]
        board[i][j] = '0'
        if self.dfs(board, i + 1, j, word[1:]) or self.dfs(board, i - 1, j, word[1:]) \
    or self.dfs(board, i, j + 1, word[1:]) or self.dfs(board, i, j - 1, word[1:]) == True:
            return True
        board[i][j] = tmp
        return False


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM