剑指offer(java版)面试题12:矩阵中的路径

14人阅读 评论(3) 收藏 举报
分类:

题目描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

思路:

1.首先遍历矩阵,找到第一个字符的下标x,y

2.递归调用hasNextPath

3.hasNextPath 有两个功能,一是检测当前坐标x、y下的值str的值是否对应相等,如果不等,返回;二是查找下一个位置的值


代码中使用二维boolean变量记录已经走过的路径,递归查找时,如果找到最后发现路径不对,paths值需置为false,认为该路径上未走过;


代码:

public class Solution {

    public static void main(String[] args) {
        System.out.print(hasPath("ABCESFCSADEE".toCharArray(), 3, 4, "ABCCED".toCharArray()));

    }

    public static boolean hasPath(char[] matrix, int rows, int cols, char[] str) {
        char[][] paths = new char[rows][cols];
        int index = 0;
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                paths[i][j] = matrix[index++];
            }
        }

        for (int i = 0; i < paths.length; i++) {
            for (int j = 0; j < paths[0].length; j++) {
                if (paths[i][j] == str[0]) {
                    boolean[][] results = new boolean[rows][cols];
                    if (hasNextPath(results, paths, i, j, str, 0)) {
                        System.out.println("i  :" + i + "  j: " + j);
                        return true;
                    }
                }
            }
        }
        return false;
    }

    public static boolean hasNextPath(boolean[][] path, char[][] matrix, int x, int y, char[] str, int start) {
        if (start >= str.length) {
            return true;
        }

        if (!checkPath(path, matrix, x, y, str, start)) {
            return false;
        }

        path[x][y] = true;
        boolean result = hasNextPath(path, matrix, x - 1, y, str, start + 1) |
                hasNextPath(path, matrix, x + 1, y, str, start + 1) |
                hasNextPath(path, matrix, x, y - 1, str, start + 1) |
                hasNextPath(path, matrix, x, y + 1, str, start + 1);
        if (result) {
            return true;
        }

        path[x][y] = false;
        return false;
    }


    private static boolean checkPath(boolean[][] path, char[][] matrix, int x, int y, char[] str, int start) {
        if (x < 0 || x >= matrix.length || y < 0 || y >= matrix[0].length || path[x][y] || matrix[x][y] != str[start]) {
            return false;
        }
        System.out.println("check succes " + matrix[x][y]);
        return true;
    }
}

查看评论

【剑指Offer学习】【面试题66:矩阵中的路径】

题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中间向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径...
  • DERRANTCM
  • DERRANTCM
  • 2015-07-15 07:10:06
  • 2870

剑指offer--面试题12:矩阵中的路径

#include #include bool hasPathCore(const char* matrix, int rows, int cols, int row, int col, cons...
  • u010726692
  • u010726692
  • 2017-07-11 15:46:10
  • 110

剑指offer面试题12 (二)

从今天起,每天理解一道剑指offer面试题,加油!
  • qq_34328833
  • qq_34328833
  • 2016-05-15 14:55:40
  • 1122

剑指Offer面试题9(java版)斐波那契数列

题目一:写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列的定义如下: 1、效率很低效的解法,挑剔的面试官不会喜欢 很多C语言的教科书在讲述递归函数的时候,都户拿Fibonacci作为例子,...
  • jsqfengbao
  • jsqfengbao
  • 2015-07-29 08:47:20
  • 1852

剑指offer-矩阵中的路径

剑指offer-矩阵中的路径问题描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一...
  • huzhigenlaohu
  • huzhigenlaohu
  • 2016-07-09 16:15:14
  • 1225

剑指offer——矩阵中的路径

问题描述: 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵...
  • sbq63683210
  • sbq63683210
  • 2016-06-17 23:11:55
  • 956

剑指offer面试题 java解答1-5

面试题1:赋值运算符函数 Java中不能重载运算符(C++可以) String 类的“+”是通过StringBuidler的append追加实现的。 可以重写自定...
  • frasker
  • frasker
  • 2016-08-22 16:19:38
  • 600

《剑指offer》:[66]矩阵中的路径

题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中间向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径...
  • gogoky
  • gogoky
  • 2016-06-30 10:31:21
  • 1256

剑指offer面试题3-数组中重复的数字 java

题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为...
  • u012562297
  • u012562297
  • 2017-06-06 11:56:43
  • 253

打印1到最大的n位数

面试题12:打印1到最大的n位数题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1,2,3,一直到最大的三位数999。首先这个题目看起来很简单。但是有很多陷阱,比如大数问题,...
  • YanJing1314
  • YanJing1314
  • 2018-03-03 22:44:59
  • 23
    个人资料
    等级:
    访问量: 1351
    积分: 157
    排名: 110万+
    文章分类
    文章存档