剑指offer12.矩阵中的路径

 太难了,想了一会儿没有头绪就直接看了题解。

class Solution {
    public boolean exist(char[][] board, String word) {
       int clowns = board.length;
       int rows = board[0].length;
       boolean[][] visited = new boolean[clowns][rows];
       for(int i =0;i<clowns;i++){
           for(int j=0;j<rows;j++){
             boolean flag = check(board, i, j, 0, visited, word);
             if(flag){
                 return true;
             }
           }
       }
      return false;
    }
    public boolean check(char[][] board, int i, int j, int k,boolean[][] visited, String word){
        if(board[i][j] != word.charAt(k)){
            return false;
        }else if(k == word.length() - 1){
            return true;
        }
        visited[i][j] = true;
        boolean result = false;
        int[][] direction = {{0,1}, {0,-1}, {1,0}, {-1,0}};
        for(int[] dir : direction){
            int newi = i + dir[0]; int newj = j + dir[1];
               if(newi >= 0 & newi < board.length & newj >= 0 & newj < board[0].length){
                if(!visited[newi][newj]){
                 boolean flag = check(board, newi, newj, k+1, visited, word);
                 if(flag){
                     result = true;
                     break;
                 }
            }
          }  
        }
        visited[i][j] = false;
        return result;
    }  
}

题解用的是回溯算法,check(i,j,k)表示从board[i][j]位置开始能否搜索到word第k个字符后面的字串,能搜索到返回true否则返回false。如果board[i][j] != word[k] 返回false。如果相等且是最后一个字符返回true,如果相等但不是最后一个字符,遍历所有相邻位置,如果能搜索到word[k+1]返回true否则返回false。遍历所有位置的[i][j],只要有一个能返回true说明能够找到,否则找不到,其中还要维护一个visited的boolean数组,访问过的元素不能再访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝味啊~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值