剑指Offer12|矩阵中路径(搜索与回溯),学习笔记

 1.暴力搜索从每一个字符开始的可能性。

2.DFS条件

a.递归参数: 当前元素在矩阵 board 中的行列索引 i 和 j ,当前目标字符在 word 中的索引 k 。
b.终止条件:
返回 false : (1) 行或列索引越界 或 (2) 当前矩阵元素与目标字符不同 或 (3) 当前矩阵元素已访问过 ( (3) 可合并至 (2) ) 。
返回 true : k = len(word) - 1 ,即字符串 word 已全部匹配。
c.递推工作:
标记当前矩阵元素: 将 board[i][j] 修改为 空字符 '' ,代表此元素已访问过,防止之后搜索时重复访问。
搜索下一单元格: 朝当前元素的 上、下、左、右 四个方向开启下层递归,使用 或 连接 (代表只需找到一条可行路径就直接返回,不再做后续 DFS ),并记录结果至 res 。
还原当前矩阵元素: 将 board[i][j] 元素还原至初始值,即 word[k] 。
返回值: 返回布尔量 res ,代表是否搜索到目标字符串


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++){

                //每一个字符都需要遍历,即从每一个点开始dfs,看能否找到符合要求的word!

                if(dfs(board, words, i, j, 0)) return true;

                //return dfs(board, words, i, j, 0); 写错了,这一句只能用来return true判断,不能return false,所以这样写是不对的

            }

        }

        return false;





    }

    public boolean dfs(char[][]board, char[] word,int i, int j, int k){

        if(i > board.length-1 || i<0 || j > board[0].length-1 || 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, j+1, k+1)||dfs(board, word, i-1, j, k+1)||dfs(board, word, i+1, j, k+1)||dfs(board, word, i, j-1, k+1);

        //若上一行返回true,则说明找到;若返回false,说明当前字符开始遍历dfs失败,需要换下一个字符开始遍历,需要还原字符!!

        board[i][j] = word[k];

        return res;

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值