剑指 Offer 12. 矩阵中的路径

题目:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
解法:回溯法
思路:剪枝操作:如果某个位置的上下左右都没有当前要找的字母,则是没希望的
代码:
package offer.q12;

public class A1 {

static boolean flag = false;

public static boolean exist(char[][] board, String word) {
    if(word=="") return true;
    for (int i = 0; i < board.length; i++) {
        for (int j = 0; j < board[0].length; j++) {
            if(board[i][j]==word.charAt(0)){
                recur(i,j,1,board,word);
                if(flag) return true;
            }
        }
    }
    return flag;
}

private static void recur(int i, int j,int k,char[][] board,String word) {
    if(k==word.length()){
        flag = true;
    } else{
        if((i-1>=0&&word.charAt(k)==board[i-1][j])){
            recur(i-1,j,k+1,board,word);
        }
        if((i+1<board.length&&word.charAt(k)==board[i+1][j])){
            recur(i+1,j,k+1,board,word);
        }
        if((j-1>=0&&word.charAt(k)==board[i][j-1])){
            recur(i,j-1,k+1,board,word);
        }
        if((j+1<board[0].length&&word.charAt(k)==board[i][j+1])){
            recur(i,j+1,k+1,board,word);
        }
    }
}

public static void main(String[] args) {
    char[][] board = new char[][]{{'c','a','a'},{'a','a','a'},{'b','c','d'}};
    String word = "aab";
    System.out.println(exist(board, word));
}

}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

posted @ 2021-09-10 15:48  for_ward  阅读(11)  评论(0)    收藏  举报