剑指 Offer 12. 矩阵中的路径
考察回溯法
回溯其实就是纯暴力枚举,把所有情况列举下,如果列举到一半发现已经不符合要求了及时剪枝,并且把之前做出的选择撤销,比如本题如果列举的一条路径不符合要求,把之前访问过的位置全部改回原来的值。也就是先试着走着,不对就撤回去,再重走(枚举的搜索尝试过程)。
第一步:先在二维数组中找到字符串的第一个字符
第二步:找到后将该位置置为’-’,防止重复访问
第三步:向该位置的周围遍历,看哪个符合下个字符的内容
第四步:若符合继续找下去,否则还原置为’-'的元素,返回去重找
代码为:
var exist = function(board, word) {
var row = board.length;
var col = board[0].length;
var dfs = function(i,j,board,word,index){
if(i < 0 || i >= row || j < 0 || j > col || board[i][j] !== word[index]) return false; // 判断不符合条件
if(index === word.length - 1) return true; // word遍历完了
var tmp = board[i][j]; // 记录到board的值
board[i][j] = '-' // 锁上,因为后续的递归是4个方向上的,无法保证上一个方向的值
var res = dfs(i - 1,j,board,word,index + 1) || dfs(i + 1,j,board,word,index + 1) || dfs(i,j - 1,board,word,index + 1) || dfs(i,j + 1,board,word,index + 1);
board[i][j] = tmp; // 恢复现场,这里是回溯法的核心所在,剪枝
return res;
}
// 遍历整个board,找到初始位置点
for(var i = 0;i < row; i++){
for(var j = 0; j < col; j++){
if(dfs(i,j,board,word,0)) return true;
}
}
// 没找到
return false
}