给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

 

示例:

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

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

 

提示:

  • boardword 中只包含大写和小写英文字母。
  • 1 <= board.length <= 200
  • 1 <= board[i].length <= 200
  • 1 <= word.length <= 10^3

DFS+回溯

看到二维表就想到DFS,遍历整个二维表,当前位置为word开头字母时才执行DFS,同时还要加一个vis数组表示已访问的位置,然后加一些判断条件剪枝。

Code

	def exist(self, board: List[List[str]], word: str) -> bool:
		def dfs(x, y, tmp):
			nonlocal flag
			if tmp == word:
				flag = True
				return
			if not (0 <= x < rowLength and 0 <= y < colLength):
				return
			if flag or vis[x][y] or board[x][y] != word[len(tmp)]:
				return
			vis[x][y] = True
			dfs(x + 1, y, tmp + board[x][y])
			dfs(x - 1, y, tmp + board[x][y])
			dfs(x, y + 1, tmp + board[x][y])
			dfs(x, y - 1, tmp + board[x][y])
			vis[x][y] = False

		rowLength, colLength, flag = len(board), len(board[0]), False
		vis = [[False for _ in range(colLength)] for _ in range(rowLength)]
		for i in range(rowLength):
			for j in range(colLength):
				if board[i][j] == word[0]:
					dfs(i, j, '')
				if flag:
					return flag
		return flag