【LeetCode 中等題】42-單詞搜尋
阿新 • • 發佈:2019-01-07
題目描述:給定一個二維網格和一個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重複使用。
示例:
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