zoukankan      html  css  js  c++  java
  • [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 }
  • 相关阅读:
    2018 桂林ccpc现场赛 总结
    2018 南京icpc现场赛总结
    nowcoder 203J Graph Coloring I(dfs)
    nowcoder 203A Knight(贪心+打表)
    nowcoder 202H-卡牌游戏
    nowcoder 202F-平衡二叉树
    topcoder srm 738 div1 FindThePerfectTriangle(枚举)
    codeforces 1041 E.Vasya and Good Sequences(暴力?)
    hdu 3507 Print Article(dp+斜率优化)
    hdu 1007 Quoit Design(分治)
  • 原文地址:https://www.cnblogs.com/blzm742624643/p/14722006.html
Copyright © 2011-2022 走看看