1 问题
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例 1:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true
示例 2:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “SEE”
输出:true
示例 3:
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCB”
输出:false
2 答案
这题直接不会,感觉有点像回溯,没写出来
官方解
回溯算法 + dfs(深度优先搜索),很简洁,很容易理解
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
row = len(board)
col = len(board[0])
def dfs(i, j, k, visited):
if k == len(word):
return True
for x, y in [(0, 1), (1, 0), (0, -1), (-1, 0)]:
tmpx = i + x
tmpy = j + y
if 0<=tmpx<row and 0<=tmpy<col and (tmpx, tmpy) not in visited and board[tmpx][tmpy] == word[k]:
visited.add((tmpx, tmpy))
if dfs(tmpx, tmpy, k+1, visited):
return True
# return dfs(temp_i, temp_j, k+1, visited) # 不能直接 return,会把 True 的误判成 False
visited.remove((tmpx, tmpy)) # 回溯
# if dfs(tmpx, tmpy, k+1, visited.add((i, j))):
# return True
# 这样写不可以,报错TypeError: argument of type 'NoneType' is not iterable,不知道为啥,只能先add后remove
return False
for i in range(row):
for j in range(col):
if board[i][j] == word[0] and dfs(i, j, 1, {(i, j)}):
return True
return False
不可以直接在实参中传入visited.add((i, j))
,只能先add后remove,还不清楚原因
https://leetcode.cn/problems/word-search/solutions/6907/hui-su-dfs-by-powcai/