添加链接描述
class Solution(object):# 定义上下左右四个行走方向directs = [(0, 1), (0, -1), (1, 0), (-1, 0)]def exist(self, board, word):""":type board: List[List[str]]:type word: str:rtype: bool"""m = len(board)if m == 0:return Falsen = len(board[0])mark = [[0 for _ in range(n)] for _ in range(m)]for i in range(len(board)):for j in range(len(board[0])):if board[i][j] == word[0]:# 将该元素标记为已使用mark[i][j] = 1if self.backtrack(i, j, mark, board, word[1:]) == True:return Trueelse:# 回溯mark[i][j] = 0return Falsedef backtrack(self, i, j, mark, board, word):if len(word) == 0:return Truefor 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 mark[cur_i][cur_j] == 1:continue# 将该元素标记为已使用mark[cur_i][cur_j] = 1if self.backtrack(cur_i, cur_j, mark, board, word[1:]) == True:return Trueelse:# 回溯mark[cur_i][cur_j] = 0return False
思路:
- 首先在board中找到target中的第一个字母
- 为什么要使用一个mark数组记录是否使用过?为了应对下面这个情况:
- 为什么要回溯?也是上面这个情况,比如我一个s周围有4个e,第一个e用不了,那就回尝试第二个,第三个,第四个…所以需要回溯
- directs数组用来进行扫荡,而且所有循环都是在这个扫荡的基础上进行的
- 边界值条件,不能比0小,也不能超过最大值,并且需要字母匹配
- 很全面的一道题,值得反复做