请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
java:
1 public class Solution { 2 private static final int[][] next = { {0,1} , {0,-1} , {1,0} , {-1,0}} ; 3 private int rows ; 4 private int cols ; 5 public boolean hasPath(char[] matrix, int rows, int cols, char[] str) 6 { 7 if (rows == 0 || cols == 0) 8 return false ; 9 this.rows = rows ;10 this.cols = cols ;11 boolean[][] mark = new boolean[rows][cols] ;12 char[][] arr = init(matrix) ;13 for(int i = 0 ; i < rows ; i++){14 for(int j = 0 ; j < cols ; j++){15 if (backtrcking(arr,str,mark,0,i,j))16 return true ;17 }18 }19 return false ;20 }21 22 private boolean backtrcking(char[][] arr , char[] str , boolean[][] mark , int curLen , int r , int c){23 if (curLen == str.length)24 return true ;25 if (r < 0 || r >= rows || c < 0 || c >= cols || mark[r][c] || arr[r][c] != str[curLen])26 return false ;27 mark[r][c] = true ;28 for(int[] n : next){29 if (backtrcking(arr,str,mark,curLen+1,r+n[0],c+n[1]))30 return true ;31 }32 mark[r][c] = false ;33 return false ;34 }35 36 private char[][] init(char[] matrix){37 char[][] arr = new char[rows][cols] ;38 int k = 0 ;39 for(int i = 0 ; i < rows ; i++){40 for(int j = 0 ; j < cols ; j++){41 arr[i][j] = matrix[k++] ;42 }43 }44 return arr ;45 }46 47 48 }