剑指offer——图

(一)剑指Offer12. 矩阵中的路径

在这里插入图片描述
基本思路:
图中最常见的就是DFS和BFS算法的应用,即搜索方法。这一题如果把顶点看做根节点,那么实际就是一个DFS搜索的题。由于在搜索过程中可能走向重复的点,所以需要维护一个数组,用于存储每个结点是否访问过。

class Solution {
    boolean flag = false;//标识路径是否存在
    void helpFunc(char[][] board, int target, char[] words,int x, int y){
        //target:现在要找words中的第几个字符   x、y:当前位于board的那个位置
        if(flag == true || x < 0 || x >= board.length || y < 0 || y >= board[0].length || board[x][y] != words[target]){
            return ;
        }
        if(target == words.length-1 && board[x][y] == words[target]){
            flag = true;
            return ;
        }
        if(target != words.length-1 && board[x][y] == words[target]){
            board[x][y] = '\0';//特殊的访问标志方法
            helpFunc(board,target+1,words,x+1,y);
            helpFunc(board,target+1,words,x,y+1);
            helpFunc(board,target+1,words,x-1,y);
            helpFunc(board,target+1,words,x,y-1);
            board[x][y]= words[target];
            return;
        }
    }
    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++){
                //选择路径的起始位置
                helpFunc(board,0,words,i,j);
                //查找从这个点出发是否存在该路径,通过flag标识
                if(flag == true){
                    return true;
                }
            }
        }
        return false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值