1. 程式人生 > >LeetCode79:Word Search

LeetCode79:Word Search

Given a 2D board and a word, find if the word exists in the grid.

The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.

Example:

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.

LeetCode:連結

在一個二維表格裡面,看看能不能連續的一筆畫出word這個詞。

還是經典的回溯法問題。這個題的回溯的起點可以是二維陣列的任意位置。

使用dfs來搜尋,首先找到第一個字母,然後進行深度搜索,已經走過的位置不能再次訪問。為了避免已經用到的字母被重複搜尋,將已經用到的字母臨時替換為'#'。

class Solution(object):
    def exist(self, board, word):
        """
        :type board: List[List[str]]
        :type word: str
        :rtype: bool
        """
        def dfs(x, y, word):
            if len(word) == 0:
                return True
            # up
            if x > 0 and board[x-1][y] == word[0]:
                tmp = board[x][y]
                board[x][y] = '#'
                if dfs(x-1, y, word[1:]):
                    return True
                board[x][y] = tmp
            # down
            if x < len(board)-1 and board[x+1][y] == word[0]:
                tmp = board[x][y]
                board[x][y] = '#'
                if dfs(x+1, y, word[1:]):
                    return True
                board[x][y] = tmp
            # left
            if y > 0 and board[x][y-1] == word[0]:
                tmp = board[x][y]
                board[x][y] = '#'
                if dfs(x, y - 1, word[1:]):
                    return True
                board[x][y] = tmp
            # right
            if y < len(board[0]) - 1 and board[x][y+1] == word[0]:
                tmp = board[x][y]
                board[x][y] = '#'
                if dfs(x, y + 1, word[1:]):
                    return True
                board[x][y] = tmp

        if not board or not board[0]:
            return False
        for i in range(len(board)):
            for j in range(len(board[0])):
                if board[i][j] == word[0]:
                    if (dfs(i, j, word[1:])):
                        return True
        return False