剑指 Offer 12. 矩阵中的路径

剑指 Offer 12. 矩阵中的路径

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。


例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。

示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例 2:

输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false

提示:

1 <= board.length <= 200
1 <= board[i].length <= 200
board 和 word 仅由大小写英文字母组成

package 剑指offer二刷;

/**
 * @author :szq
 * @date :Created in 2022/3/16 10:58
 * @description:12. 矩阵中的路径
 * @modified By:
 * @version: $
 */
public class 矩阵中的路径 {
    int[][] visit = new int[200][200];
    String word ;
    int n,m;
    char[][] board;
    public boolean exist(char[][] board, String word) {
        this.board = board;
        this.n = board.length;
        this.m = board[0].length;
        this.word = word;
        for(int i = 0 ; i < board.length;i++)
        {
            for(int j = 0; j  < board[i].length;j++)
            {
                if(board[i][j] == word.charAt(0))
                {
                    if(dfs(i,j,0))return  true;
                }
            }
        }
        return false;
    }

    public boolean dfs(int i,int j,int l )
    {
        if(l==word.length())return  true;
        if(i<0||i>=n||j>0||j>=m||visit[i][j]==1||word.charAt(l)!=board[i][j])
            return false;
        visit[i][j] = 1; //标记深搜
        //CAA
        //AAA
        //BCD
        boolean res = dfs(i+1,j,l+1)||
                dfs(i,j+1,l+1)||
                dfs(i-1,j,l+1)||
                dfs(i,j-1,l+1);

        visit[i][j] = 0; //像这个例子 只能从中间才能找到,中间第一个走过来需要回溯
        //CAA
        //AAA
        //BCD
        return res;
    }


    public static void main(String[] args) {

    }
}

posted @ 2022-03-16 11:17  小申同学  阅读(16)  评论(0编辑  收藏  举报