题目链接

牛客网

题目描述

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

解题思路

回溯思想,注意给的array是char[],不是char[][],需要我们手动转换一下

public class Solution {
   
    private int[][] directions = {
   {
   -1, 0}, {
   1, 0}, {
   0, -1}, {
   0, 1}};
    private int m, n;
    public boolean hasPath(char[] array, int rows, int cols, char[] str){
   
        if (rows==0 || cols==0) return false;
        m = rows; n = cols;
        char[][] matrix = makeMatrix(array);
        boolean[][] marked = new boolean[m][n];
        for (int i=0;i<m;i++) {
   
            for (int j=0;j<n;j++) {
   
                if (backtracking(matrix, i, j, marked, 0, str)) return true;
            }
        }
        return false;
    }
    private boolean backtracking(char[][] matrix, int i, int j, boolean[][] marked, int level, char[] str) {
   
        if (level==str.length) return true;
        if (i<0 || i>=m || j<0 || j>=n || marked[i][j] || matrix[i][j]!=str[level]) return false;
        marked[i][j] = true;
        for (int[] d: directions) {
   
            if (backtracking(matrix, i+d[0], j+d[1], marked, level+1, str)) return true;
        }
        marked[i][j] = false;
        return false;
    }
    private char[][] makeMatrix(char[] matrix) {
   
        char[][] res = new char[m][n];
        int idx = 0;
        for (int i=0;i<m;i++) {
   
            for (int j=0;j<n;j++) {
   
                res[i][j] = matrix[idx++];
            }
        }
        return res;
    }

}