import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * @param matrix string字符串 * @param rows int整型 * @param cols int整型 * @param str string字符串 * @return bool布尔型 */ boolean[] visited; static int row, col; public boolean hasPath (String matrix, int rows, int cols, String str) { // write code here // 构建数组 visited = new boolean[rows * cols]; row = rows; col = cols; char[] matrixs = matrix.toCharArray(); char[] strArrs = str.toCharArray(); for(int i = 0; i < rows; i++) { for(int j = 0; j < cols; j++) { if(judge(matrixs, strArrs, i, j, 0)) { return true; } } } return false; } // 递归:判断是否能走完, k表示应经匹配k个了 private boolean judge(char[] mat, char[] str, int i, int j, int k) { // 将要访问的数组下标 int pos = i * col + j; // base case,回溯 if(i < 0 || i >= row || j < 0 || j >= col || mat[pos] != str[k] || visited[pos] == true) { return false; } // 标记访问过 visited[pos] = true; // 当前下标pos能匹配,再判断是否到最后一个 if(k == str.length - 1) { return true; } // 每次匹配成功,计数+1 k++; // 上下左右 if(judge(mat, str, i + 1, j, k) || judge(mat, str, i, j + 1, k) || judge(mat, str, i - 1, j, k) || judge(mat, str, i, j - 1, k)) { return true; } // 递归结束下,清除到达过的标记 visited[pos] = false; return false; } }