矩阵中的路径

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

 

posted @ 2019-03-30 15:19  __Meng  阅读(161)  评论(0编辑  收藏  举报