请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 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 }