不确定第一个字母的初始位置,遍历寻找一遍,找到初始位置,设置访问数组,通过一系列条件判断
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;
}
}
京公网安备 11010502036488号