1. 程式人生 > 實用技巧 >Leetcode 79 Word Search

Leetcode 79 Word Search

題目介紹

給定一個二維陣列以及單詞,判斷單詞是否存在於該陣列中。要求按順序,且只能相鄰(水平或垂直方向)查詢。每個字母只能使用一次。

Examples:

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

Given word = "ABCCED", return true.
Given word = "SEE", return true.
Given word = "ABCB", return false

Solution

使用回溯,當查詢到某個字母相等時,再以該座標出發去尋找是否相鄰位置有下一個字母。而由於每個字母只能使用一次,因此,需要對已經遍歷過的字母做標記。

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, n = len(board), len(board[0])
        
        def helpfunc(i, j, k):
            # 優先判斷k,否則只有一個字母的單詞會返回False 
            if k == len(word):
                return True
            if i<0 or i>=m or j<0 or j>=n:
                return False
            # 標記已經使用的字母
            if board[i][j] == word[k]:
                board[i][j] = 0

                if helpfunc(i, j-1, k + 1) or helpfunc(i, j+1, k+1) or helpfunc(i-1, j, k+1) or helpfunc(i+1, j, k+1):
                    return True
                # 恢復標記
                board[i][j] = word[k]
        for i in range(m):
            for j in range(n):
                if helpfunc(i, j, 0):
                    return True
        return False