思路梗概:
从m*n矩阵里面找到第一个与word[0]匹配的字母;设置i,j分别为当前位置的横纵坐标轴,k为要匹配的word的索引值。
所以代码应该是:
for i in range(board):
for j in range(board[0]):
if dfs(i, j, 0): return True
要点:从k=0的位置先找到第一个匹配的位置。
对于当前位置board[i][j]的值:
如果当前位置的值不等于第一个word中的字母,返回False
如果当前索引i,和j超过了矩阵board1的行数和列数,则返回False(这一步暂时还不清楚为啥,前面已经限定i和j的范围了,为什么还会超出范围呢?但是不加上这一步过不了测试案例)
如果当前word[0]已经匹配了,后面要继续word[1]的匹配。
if board[i][j] != word[k] or not 0 <= i < len(board) or not 0 <= j < len(board[0]): return False
对于word[1]的匹配来说,要注意以下几个点:
对board[i][j]中的四个方向进行判断能不能匹配到word[1]
为了避免重复返回board[i][j],我们要暂时将board[i][j]置为空值,这一次遍历之后还原回来;
这部分代码:
board[i][j] = "#"
res = dfs(i-1, j, k+1) or dfs(i+1, j) or dfs(i, j-1, k+1) or dfs(i, j+1, k+1)# res是bool类型
board[i][j] = word[k]
最后如果全部word值都匹配完成,则返回True
if k = len(word) -1: return True
所以总的代码如下:
class Solution(object):
def exist(self, board, word):
"""
:type board: List[List[str]]
:type word: str
:rtype: bool
"""
def dfs(i, j, k):
if not 0 <= i <len(board) or not 0 <= j < len(board[0]) or board[i][j] != word[k]: return False
if k == len(word)-1: return True
board[i][j] = '#'
res = dfs(i-1, j, k+1) or dfs(i+1, j, k+1) or dfs(i, j-1, k+1) or dfs(i, j+1, k+1)
board[i][j] = word[k]
return res
for i in range(len(board)):
for j in range(len(board[0])):
if dfs(i, j, 0): return True
return False