题目描述:
给定一个
m
m
m x
n
n
n 二维字符网格
b
o
a
r
d
board
board 和一个字符串单词
w
o
r
d
word
word 如果
w
o
r
d
word
word 存在于网格中,返回
t
r
u
e
true
true ;否则,返回
f
a
l
s
e
false
false 。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的
3
×
4
3×4
3×4 的矩阵中包含单词
"
A
B
C
C
E
D
"
"ABCCED"
"ABCCED"(单词中的字母已标出)。

示例 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof
示例 2:
输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false
提示
- 1 < = b o a r d . l e n g t h < = 200 1 <= board.length <= 200 1<=board.length<=200
- 1 < = b o a r d [ i ] . l e n g t h < = 200 1 <= board[i].length <= 200 1<=board[i].length<=200
- b o a r d 和 w o r d 仅 由 大 小 写 英 文 字 母 组 成 board 和 word 仅由大小写英文字母组成 board和word仅由大小写英文字母组成
解题思路
递归参数:
当前元素在矩阵 b o a r d board board 中的行列索引 i i i 和 j j j,当前目标字符在 w o r d word word 中的索引 k k k。
终止条件:
- 返回 f a l s e false false : (1) 行或列索引越界 或 (2) 当前矩阵元素与目标字符不同 或 (3) 当前矩阵元素已访问过 ( (3) 可合并至 (2) ) 。
- 返回 t r u e : k = l e n ( w o r d ) − 1 true: k = len(word) - 1 true:k=len(word)−1 ,即字符串 w o r d word word 已全部匹配。
递推工作:
- 标记当前矩阵元素: 将 b o a r d [ i ] [ j ] board[i][j] board[i][j] 修改为 空字符 ‘’ ,代表此元素已访问过,防止之后搜索时重复访问。
- 搜索下一单元格: 朝当前元素的 上、下、左、右 四个方向开启下层递归,使用 或 连接 (代表只需找到一条可行路径就直接返回,不再做后续 DFS ),并记录结果至 r e s res res 。
- 还原当前矩阵元素: 将 b o a r d [ i ] [ j ] board[i][j] board[i][j] 元素还原至初始值,即 w o r d [ k ] word[k] word[k] 。
返回值:
返回布尔量 r e s res res ,代表是否搜索到目标字符串。
使用空字符(Python: ‘’ , Java/C++: ‘\0’ )做标记是为了防止标记字符与矩阵原有字符重复。当存在重复时,此算法会将矩阵原有字符认作标记字符,从而出现错误。
python3代码
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
m=len(board)
n=len(board[0]) if board else 0
def dfs(k,i,j):
if not 0<=i<m or not 0<=j<n or word[k]!= board[i][j]:
return False
if k==len(word)-1:
return True
tmp=board[i][j]
board[i][j]='#'
res=dfs(k+1,i-1,j) or dfs(k+1,i+1,j) or dfs(k+1,i,j-1) or dfs(k+1,i,j+1)
board[i][j]=tmp
return res
for i in range(m):
for j in range(n):
if dfs(0,i,j):
return True
return False
java代码
class Solution {
public boolean exist(char[][] board, String word) {
char[] words=word.toCharArray();
for(int i=0;i<board.length;i++){
for(int j=0;j<board[0].length;j++){
if(dfs(board,words,i,j,0))return true;
}
}
return false;
}
boolean dfs(char[][] board,char[] word,int i,int j,int k){
if(i>=board.length || i<0 || j>=board[0].length || j<0 || board[i][j]!=word[k])
return false;
if(k==word.length-1)
return true;
board[i][j]='\0';
boolean res=dfs(board,word,i+1,j,k+1)|| dfs(board,word,i-1,j,k+1) ||dfs(board,word,i,j+1,k+1) ||dfs(board,word,i,j-1,k+1);
board[i][j]=word[k];
return res;
}
}