1. 程式人生 > >【LeetCode 中等題】42-單詞搜尋

【LeetCode 中等題】42-單詞搜尋

題目描述:給定一個二維網格和一個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重複使用。

示例:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

給定 word = "ABCCED", 返回 true.
給定 word = "SEE", 返回 true.
給定 word = "ABCB", 返回 false.

解法1。找字串不一定要從頭開始,所以設定一個雙重巢狀for迴圈保證可以從任一個位置開始索引,設定一個等大小的矩陣儲存標誌位,在helper函式中首先設定好return False和True的條件,然後遞迴判斷上下左右4個位置是否滿足,遞迴返回上一層後記得把visited復位變成沒有訪問過。

別的做法思路相當,但事先判斷更全面一些,比如增加判斷word長度是否小於等於m*n,word裡的字元board是否都有。

class Solution(object):
    def exist(self, board, word):
        """
        :type board: List[List[str]]
        :type word: str
        :rtype: bool
        """
        if not board or not word:
            return False
        m = len(board)
        n = len(board[0])
        visited = [[0 for _ in range(n)] for _ in range(m)]
        for i in range(m):
            for j in range(n):
                if self.helper(board, word, m, n, i, j, 0, visited):
                    return True
        return False
    
    def helper(self, board, word, m, n, i, j, k, visited):
        if i<0 or i>=m or j<0 or j>=n or board[i][j] != word[k] or visited[i][j] == 1:
            return False
        if k == len(word)-1:
            return True
        visited[i][j] = 1
        if self.helper(board,word, m, n, i-1,j,k+1,visited) or \
        self.helper(board,word, m, n, i,j-1,k+1,visited) or \
        self.helper(board,word, m, n, i+1,j,k+1,visited) or \
        self.helper(board,word, m, n, i,j+1,k+1,visited):
            return True
        visited[i][j] = 0
        return