剑指 Offer 12. 矩阵中的路径

题目:

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。

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

但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。

 

示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true

示例 2:

输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false

 

提示:

  • 1 <= board.length <= 200
  • 1 <= board[i].length <= 200

代码:

复制代码
  1 class Solution {
  2 
  3   public static boolean result=false;
  4 
  5   public boolean exist(char[][] board, String word) {
  6 
  7if(board==null||board.length==0||word.length()==0){return false;}
  8 
  9int n=board.length;
 10 
 11int m=board[0].length;
 12 
 13boolean[][] bool=new boolean[n][m];
 14 
 15char first_char=word.charAt(0);
 16 
 17for(int i=0;i<n;i++){
 18 
 19for(int j=0;j<m;j++){
 20 
 21if(first_char==board[i][j]){
 22 
 23 ​          bool[i][j]=true;
 24 
 25 ​          fun0(board,i,j,word,1,bool);
 26 
 27if(result==true){
 28 
 29 ​            result=false;  //这一步真实情况下可以不用写,这里是因为力扣会一直记录全局变量的值,上一次实例的值会保存在这一次中
 30 
 31return true;
 32 
 33 ​            }
 34 
 35 ​          bool[i][j]=false;
 36 
 37 ​        }
 38 
 39 ​      }
 40 
 41 ​    }
 42 
 43return false;
 44 
 45   }
 46 
 47 
 48 
 49   public static void fun0(char[][] board,int n,int m,String word,int t,boolean[][] bool){
 50 
 51if(result==false){
 52 
 53if(word.length()==t){result=true;}
 54 
 55else{        
 56 
 57if(n>=1&&bool[n-1][m]==false){  //上边一位未经过
 58 
 59if(board[n-1][m]==word.charAt(t)){
 60 
 61 ​              bool[n-1][m]=true;
 62 
 63 ​              fun0(board,n-1,m,word,t+1,bool);
 64 
 65 ​              bool[n-1][m]=false;
 66 
 67 ​            }
 68 
 69 ​          }
 70 
 71if(n<board.length-1&&bool[n+1][m]==false){  //下边一位未经过
 72 
 73if(board[n+1][m]==word.charAt(t)){    
 74 
 75 ​              bool[n+1][m]=true;
 76 
 77 ​              fun0(board,n+1,m,word,t+1,bool);
 78 
 79 ​              bool[n+1][m]=false;
 80 
 81 ​            }
 82 
 83 ​          }
 84 
 85if(m>=1&&bool[n][m-1]==false){  //左边一位未经过
 86 
 87if(board[n][m-1]==word.charAt(t)){    
 88 
 89 ​              bool[n][m-1]=true;
 90 
 91 ​              fun0(board,n,m-1,word,t+1,bool);
 92 
 93 ​              bool[n][m-1]=false;
 94 
 95 ​            }
 96 
 97 ​          }
 98 
 99if(m<board[0].length-1&&bool[n][m+1]==false){  //左边一位未经过
100 
101if(board[n][m+1]==word.charAt(t)){    
102 
103 ​              bool[n][m+1]=true;
104 
105 ​              fun0(board,n,m+1,word,t+1,bool);
106 
107 ​              bool[n][m+1]=false;
108 
109 ​            }
110 
111 ​          }
112 
113 ​        }      
114 
115 ​    }    
116 
117   }
118 
119 }
复制代码

 

posted @   堤苏白  阅读(29)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示