11.矩阵中的路径

请设计一个函数,用来判断在一个矩阵中是否存在一条路径包含的字符按访问顺序连在一起恰好为给定字符串。

路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。

如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。

注意:

  • 输入的路径字符串不为空;
  • 所有出现的字符均为大写英文字母;

数据范围:

矩阵中元素的总个数 [0,900]。
路径字符串的总长度 [1,900]。

样例:

matrix=
[
["A","B","C","E"],
["S","F","C","S"],
["A","D","E","E"]
]
str="BCCE" , return "true"
str="ASAE" , return "false"

代码:

class Solution {
    //定义上下左右四个方向
    int[][] dir = {{-1,0},{0,1},{1,0},{0,-1}};
    public boolean hasPath(char[][] matrix, String str) {
        //遍历矩阵中每一个点作为起点
        for(int i = 0;i<matrix.length;i++){
            for(int j = 0;j<matrix[0].length;j++){
                //从当前点开始深度优先搜索
                if(dfs(matrix,i,j,0,str))return true;
            }
        }
        //所有起点都尝试过仍未找到路径,直接返回false
        return false;
    }
    public boolean dfs(char[][] matrix,int x,int y,int u,String s){
        //当前字符不匹配,直接返回false
        if(matrix[x][y]!=s.charAt(u))return false;
        //已经匹配完整个字符串
        if(u == s.length()-1)return true;
        //保存当前字符,并标记为已访问
        char t = matrix[x][y];
        matrix[x][y] = '*';
        //尝试四个方向
        for(int i = 0;i<4;i++){
            int x1 = x+dir[i][0];
            int y1 = y+dir[i][1];
            //检查当前坐标是否在矩阵范围内
            if(x1>=0&&x1<matrix.length&&y1>=0&&y1<matrix[0].length){
                //递归搜索下一个字符
                if(dfs(matrix,x1,y1,u+1,s))return true;
            }
        }
        //恢复现场(回溯)
        matrix[x][y] = t;
        return false;
    }
}
posted @ 2025-05-13 10:51  回忆、少年  阅读(11)  评论(0)    收藏  举报