剑指offer------矩阵中的路径(java实现)

题目描述


请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。

[[“a”,“b”,“c”,“e”],
[“s”,“f”,“c”,“s”],
[“a”,“d”,“e”,“e”]]

但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。


程序代码

class Solution {
     
     int book[][];//标志数组,标记某个点是否已经
    String result = "";
    boolean flag = false;
    int n, m;//横列
    String value;

    public boolean exist(char[][] board, String word) {
     
        n = board.length;
        m = board[0].length;
        book=new int[n][m];
        if(n*m<word.length())return false;
        value = word;
        char array[] = word.toCharArray();
        int i, j;
        for (i = 0; i < n; i++) {
     
            for (j = 0; j < m; j++) {
     
                if(board[i][j]!=array[0])continue;
                result += board[i][j];
                book[i][j] = 1;
                dfs(board, i, j, array, 1);
                if (flag) return flag;
                else {
     
                    book[i][j]=0;
                    result="";
                }

            }

        }
        return flag;
    }

    /**
     * @param board 矩阵数组
     * @param x     行坐标
     * @param y     纵坐标
     * @param word  要寻找的字符串
     * @param step  第step步
     */
    public void dfs(char[][] board, int x, int y, char[] word, int step) {
     
         if(flag)return;
        int next[][] = {
     {
     0, 1}, {
     1, 0}, {
     0, -1}, {
     -1, 0}};//方向数组
        //结束条件
        if (step == word.length) {
     
            //相同则存在
            if (result.equals(value))
                flag = true;
            return;
        }
        int tx, ty;//下一步的坐标
        for (int k = 0; k <= 3; k++) {
     
            //计算坐标
            tx = x + next[k][0];
            ty = y + next[k][1];
            //越界判断
            if (tx < 0 || tx > n - 1 || ty < 0 || ty > m - 1) continue;
            if (board[tx][ty] == word[step] && book[tx][ty] == 0) {
     
                result += board[tx][ty];//
                book[tx][ty] = 1;//标记该坐标已经走过
                dfs(board, tx, ty, word, step + 1);//继续下一步
                book[tx][ty] = 0;//回退
                result=result.substring(0,result.length()-1);
            }

        }
    }
    }

总结

该题主要用了DFS的思想,这是我学习DFS后做的题,代码可能写的不好,真的很菜,有什么问题,欢迎大家提出讨论。同时这也是第一次写博客,有点小激动~~~ 嘿嘿!!

你可能感兴趣的:(剑指offer------矩阵中的路径(java实现))