79.单词搜索
思路:回溯
递归四个方向的,如果一个方向相邻的不相等,后面的都不用看了
递归终止条件:
(1)行列索引越界,字符不匹配,返回false;
(2)字符串全部匹配,返回true
递归过程:
(1)标记当前矩阵元素: 将board[i][j]
修改为 空字符 ’ ’ ,代表此元素已访问过,防止之后搜索时重复访问。
(2)搜索下一单元格: 朝当前元素的 上、下、左、右 四个方向开启下层递归
(3)还原当前矩阵元素: 将board[i][j]
元素还原至初始值,即 word[k]
。
class Solution {
public:
bool exist(vector<vector<char>>& board, string word) {
int m=board.size();
int n=board[0].size();
for(int i=0;i<m;i++){//遍历每一个格子做开头的单词递归
for(int j=0;j<n;j++){
if(backtrack(board,word,i,j,0)==true)
return true;
}
}
return false;
}
bool backtrack(vector<vector<char>>& board, string word,int i,int j,int k){
if(i>=board.size() || i<0 || j<0 || j>=board[0].size() || board[i][j]!=word[k])
return false;
if(k==word.size()-1)
return true;
board[i][j]=' ';
bool res=backtrack(board,word,i+1,j,k+1) || backtrack(board,word,i,j+1,k+1)||backtrack(board,word,i-1,j,k+1) || backtrack(board,word,i,j-1,k+1);
board[i][j]=word[k];//回溯
return res;
}
};