给定一个mxn二维字符网格board和一个字符串单词word。如果word存在于网格中,返回true;否则,返回false。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
示例一:
输入:board = [['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "ABCCED"
输出:true
示例二:
输入:board =[['A','B','C','E'],['S','F','C','S'],['A','D','E','E']], word = "SEE"
输出:true
寻找起始位置:能够保证遍历所有的情况,如果直接在递归函数里很困难;
或连接:遍历所有方向,如果有一个方向的路径成立,则成立;
回溯:还原访问状态,三个方向都访问完了,才还原状态。
递归结束条件:
- 找到路径;
- 下标越界;
- 当前值与字符串值相同;
- 当前位置已访问。
class Solution(object):
def exist(self, board, word):
"""
:type board: List[List[str]]
:type word: str
:rtype: bool
"""
r = len(board)
c = len(board[0])
m = len(word)
self.flag = False
l = list()
for i in range(r):
for j in range(c):
if board[i][j] == word[0]:
l.append([i,j])
def dfs(cur_r,cur_c,cur_w):
if self.flag:
return
if cur_w == m:
self.flag = True
return
if cur_r >= r or cur_c >= c or cur_r < 0 or cur_c < 0:
return
if board[cur_r][cur_c] != word[cur_w] or visit[cur_r][cur_c] == 1:
return
if board[cur_r][cur_c] == word[cur_w]:
visit[cur_r][cur_c] = 1
#相当于或连接,遍历每个方向
dfs(cur_r+1,cur_c,cur_w+1)
dfs(cur_r,cur_c+1,cur_w+1)
dfs(cur_r-1,cur_c,cur_w+1)
dfs(cur_r,cur_c-1,cur_w+1)
#中途某个位置走不通,退回
visit[cur_r][cur_c] = 0
#找初始位置
for addression in l:
visit = [[0]*c for _ in range(r)]
if self.flag==True:
break
dfs(addression[0],addression[1],0)
return self.flag