最新公告
  • 新注册用户请前往个人中心绑定邮箱以便接收相关凭证邮件!!!点击前往个人中心
  • 剑指Offer:矩阵中的路径

    题目描述

    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。

    例如下面的矩阵包含了一条 bfce 路径。

    解题思路

    public class Solution {
        private final static int[][] next = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
        private int rows;
        private int cols;
    
        public boolean hasPath(char[] array, int rows, int cols, char[] str) {
            if (rows == 0 || cols == 0)
                return false;
            this.rows = rows;
            this.cols = cols;
            boolean[][] marked = new boolean[rows][cols];
            char[][] matrix = buildMatrix(array);
            for (int i = 0; i < rows; i++)
                for (int j = 0; j < cols; j++)
                    if (backtracking(matrix, str, marked, 0, i, j))
                        return true;
            return false;
        }
    
        private boolean backtracking(char[][] matrix, char[] str, boolean[][] marked, int pathLen, int r, int c) {
            if (pathLen == str.length)
                return true;
            if (r < 0 || r >= rows || c < 0 || c >= cols || matrix[r][c] != str[pathLen] || marked[r][c])
                return false;
            marked[r][c] = true;
            for (int[] n : next)
                if (backtracking(matrix, str, marked, pathLen + 1, r + n[0], c + n[1]))
                    return true;
            marked[r][c] = false;
            return false;
        }
    
        private char[][] buildMatrix(char[] array) {
            char[][] matrix = new char[rows][cols];
            for (int i = 0, idx = 0; i < rows; i++)
                for (int j = 0; j < cols; j++)
                    matrix[i][j] = array[idx++];
            return matrix;
        }
    }
    
    本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
    极客文库 » 剑指Offer:矩阵中的路径

    常见问题FAQ

    如果资源链接失效了怎么办?
    本站用户分享的所有资源都有自动备份机制,如果资源链接失效,请联系本站客服QQ:2580505920更新资源地址。
    如果用户分享的资源与描述不符怎么办?
    可以联系客服QQ:2580505920,如果要求合理可以安排退款或者退赞助积分。
    如何分享个人资源获取赞助积分或其他奖励?
    本站用户可以分享自己的资源,但是必须保证资源没有侵权行为。点击个人中心,根据操作填写并上传即可。资源所获收益完全归属上传者,每周可申请提现一次。
    如果您发现了本资源有侵权行为怎么办?
    及时联系客服QQ:2580505920,核实予以删除。

    参与讨论

    • 211会员总数(位)
    • 3737资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 869稳定运行(天)

    欢迎加入「极客文库」,成为原创作者从这里开始!

    立即加入 了解更多
    成为赞助用户享有更多特权立即升级