0
点赞
收藏
分享

微信扫一扫

剑指Offer面试题12:矩阵中的路径

一、题目

请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如

请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 

剑指Offer面试题12:矩阵中的路径_字符串

 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

数据范围:0<=n,m<=20,1<=len<=25

二、题解

采用回溯法来解决。

回溯算法实际上一个类似枚举的搜索尝试过程,也就是一个个去试,我们解这道题也是通过一个个去试。

剑指Offer面试题12:矩阵中的路径_bc_02

从矩形中的一个点开始往它的上下左右四个方向查找,遍历矩形所有的点。由于是二维数组,所有有两个for循环。

public boolean hasPath(char[][] matrix,String word){
  char[] words = word.toCharArray();
  for(int i = 0;i < matrix.length;i++){
    for(int j = 0; j < matrix[0].length;j++){
      if(dfs(matrix,words,i,j,0))
        return true;
    }
  }
  return false;
}
      
boolean dfs(char[][] matrix,char[] word,int i,int j,int index){
  if(i >= matrix.length || i < 0 || j >= matrix[0].length || j < 0 || matrix[i][j] != word[index])
    return false;
  if(index == word.length -1)
    return true;
  char temp = matrix[i][j];
  matrix[i][j] = '.';
  boolean res = dfs(matrix,word,i+1,j,index + 1)
    || dfs(matrix,word,i-1,j,index+1)
    || dfs(matrix,word,i,j+1,index+1)
    || dfs(matrix,word,i,j-1,index+1);
  matrix[i][j] = temp;
  return res;
}

举报

相关推荐

0 条评论