[Java]剑指offer:矩阵中的路径

题目描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
 

示例1 输入

[[a,b,c,e],[s,f,c,s],[a,d,e,e]],"abcced"

返回值

true

示例2 输入

[[a,b,c,e],[s,f,c,s],[a,d,e,e]],"abcb"

返回值

false

思路

对矩阵中的每个位置使用深度优先搜索以查找是否有符合的字符路径

 1 import java.util.*;
 2 
 3 
 4 public class Solution {
 5     /**
 6      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 7      *
 8      * 
 9      * @param matrix char字符型二维数组 
10      * @param word string字符串 
11      * @return bool布尔型
12      */
13     
14     boolean[][] visited;
15     int[][] directions = {{-1,0},{0,-1},{0,1},{1,0}};
16     int m,n;
17     int len;
18     public boolean hasPath (char[][] matrix, String word) {
19         // write code here
20         m = matrix.length;
21         n = matrix[0].length;
22         len = word.length();
23         visited = new boolean[m][n];
24         for(int i=0;i<m;i++){
25             for(int j=0;j<n;j++){
26                 //遍历整个矩阵 把每个位置都作为起点试一次
27                 if(dfs(matrix,word,i,j,0)){
28                     return true;
29                 }
30             }
31         }
32         return false;
33     }
34     
35     public boolean dfs(char[][] matrix,String word,int i,int j,int index){
36         //最后一个字符
37         if(index==len-1){
38             return matrix[i][j] == word.charAt(index);
39         }
40         if(matrix[i][j]==word.charAt(index)){
41             visited[i][j] = true;
42             // 遍历i、j的上下左右位置
43             for(int k=0;k<4;k++){
44                 int x = i + directions[k][0];
45                 int y = j + directions[k][1];
46                 if(inArea(x,y)&&!visited[x][y]){
47                     if(dfs(matrix,word,x,y,index+1)){
48                         return true;
49                     }
50                 }
51             }
52             visited[i][j] = false;
53         }
54         return false;
55     }
56     
57     public boolean inArea(int x,int y){
58         return x>=0&&x<m&&y>=0&&y<n;
59     }
60 }
posted @ 2021-04-30 14:55  DXYE  阅读(59)  评论(0编辑  收藏  举报