剑指offer 12 矩阵中的路径
本题的算法思路一开始不清楚
public class Solution {
public static boolean hasPath(char[] matrix, int rows, int cols, char[] str)
{
if(str.length==0)
return false;
boolean [][] marked=new boolean[rows][cols];
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
marked[i][j]=false;
}
}
char [][]data=buildmatrix(matrix,rows,cols);
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
if(pathExit(data,marked,i,j,str,0)){
return true;
}
}
}
return false;
}
public static boolean pathExit(char [][]matrix,boolean [][] visit,int i,int j,char[]str,int count){
int row=matrix.length;
int col=matrix[0].length;
//这个if语句debug了很久... matrix[i][j]!=str[count]需要放在i j是否出界后再判断,要不会数组越界
//因为无法保证matrix[i][j]中的i j是否合法!!
if(i<0 || j<0 || i>row-1 || j>col-1 || matrix[i][j]!=str[count]||visit[i][j]==true){
return false;
}
if(count==str.length-1&&matrix[i][j]==str[count])
return true;
visit[i][j]=true;
boolean res=pathExit(matrix,visit,i,j+1,str,count+1)||pathExit(matrix,visit,i,j-1,str,count+1)||
pathExit(matrix,visit,i+1,j,str,count+1)||pathExit(matrix,visit,i-1,j,str,count+1);
visit[i][j]=false;//记得重置visit数组
return res;//返回的是下面的字符能否组成str,一层一层向上返回
}
public static char[][] buildmatrix(char []array, int row, int col){
char [][]matrix=new char[row][col];
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
matrix[i][j]=array[col*i+j];//如何计算取出char元素的下标需要注意
}
}
return matrix;
}
}
顺丰集团工作强度 369人发布