不确定第一个字母的初始位置,遍历寻找一遍,找到初始位置,设置访问数组,通过一系列条件判断

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param matrix char字符型二维数组 
     * @param word string字符串 
     * @return bool布尔型
     */
    public boolean hasPath (char[][] matrix, String word) {
        // write code here
        if(matrix.length==0 || word==null){
            return false;
        }
        int row=matrix.length;
        int col=matrix[0].length;
        int[][] flag=new int[row][col];
        char[] str=word.toCharArray();
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(search(matrix,i,j,word,flag,0)){
                    return true;
                }
            }
        }
        return false;
    }
    /**
     * @param matrix    字符矩阵
     * @param rows  矩阵行数
     * @param cols  矩阵列数
     * @param i   当前行索引
     * @param j   当前列索引
     * @param str   目标字符序列
     * @param index 目标字符序列中当前字符索引
     * @param flag    字符矩阵是否被访问过标记
     **/
    public static boolean search(char[][] matrix,int i,int j,String word,int[][] flag,int index){
        int rows=matrix.length;
        int cols=matrix[0].length;
        //行列索引超限、当前字符已经被访问过、当前字符不等于目标字符序列的当前字符,直接返回false
        if(i<0||j<0||i>=rows||j>=cols||flag[i][j]==1||matrix[i][j]!=word.charAt(index)){
            return false;
        }
        if(index==word.length()-1){//递归结束条件,已经到达最后一个字符了;
            return true;
        }
        flag[i][j]=1;//设置访问标记
        // 在当前字符的上、下、左、右的元素搜索下一个目标字符,递归
        if(search(matrix,i+1,j,word,flag,index+1) ||
               search(matrix,i-1,j,word,flag,index+1)||
               search(matrix,i,j+1,word,flag,index+1)||
               search(matrix,i,j-1,word,flag,index+1)
          ){
            return true;
        }
        flag[i][j]=0;
        return false;
    }
}