文章目录
题目
回溯:79. 单词搜索
给定一个 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
提示:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board 和 word 仅由大小写英文字母组成
代码
cpp
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
int rows=board.size();// 网格行数
int cols=board[0].size();// 网格列数
vector<vector<bool>> visit(rows,vector<bool>(cols,false));
for(int row=0;row<rows;row++){
for(int col=0;col<cols;col++){
if(dfs(board,word,row,col,0,visit)){
return true;
}
}
}
return false;
}
bool dfs(vector<vector<char>>& board, string word,int row,int col,int index,vector<vector<bool>>& visit){
if(index==word.length()){
return true;
}
int rows=board.size();
int cols=board[0].size();
if(row>=rows||row<0||col>=cols||col<0// 越界
||board[row][col]!=word[index]// 字符不匹配
||visit[row][col]){ // 已经走过
return false;
}
visit[row][col]=true;//防止递归时回头走重复格子。
bool res=false;
res|=dfs(board,word,row+1,col,index+1,visit);//下
res|=dfs(board,word,row,col+1,index+1,visit);//右
res|=dfs(board,word,row-1,col,index+1,visit);//上
res|=dfs(board,word,row,col-1,index+1,visit);//左
visit[row][col]=false;
return res;
}
};
原理图

原理解释
提示:算法流程及解释在代码中已标注
方法:使用DFS来穷举所有的解
边界条件:如果当前字符串下标等于字符串的长度
代码原理:
遍历网格里每一个格子作为起点
从起点开始,上下左右四个方向递归搜索
每走一步:
标记当前格子已访问(防止回头重复走)
继续往下匹配下一个字符
匹配失败就撤销标记(回溯),退回上一步
只要有一条路径匹配完整个单词,就返回 true