2022-6-25 剑指offer-dfs
给定一个 m x n
二维字符网格 board
和一个字符串单词 word
。如果 word
存在于网格中,返回 true
;否则,返回 false
。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。
1 class Solution { 2 int[][] dir={{1,0},{-1,0},{0,1},{0,-1}}; 3 public boolean exist(char[][] board, String word) { 4 int m=board.length,n=board[0].length; 5 boolean[][] visited=new boolean[m][n]; 6 for (int i=0;i<m;i++){ 7 for (int j=0;j<n;j++){ 8 visited[i][j]=true; 9 if (dfs(board,i,j,0,word,visited)) return true; 10 visited[i][j]=false; 11 } 12 } 13 return false; 14 } 15 16 public boolean dfs(char[][] board,int x,int y,int index,String word,boolean[][] visited){ 17 int m=board.length,n=board[0].length; 18 if (board[x][y]!=word.charAt(index)) return false; 19 if (index==word.length()-1) return true; 20 boolean flag=false; 21 for (int i=0;i<dir.length;i++){ 22 int dx=x+dir[i][0]; 23 int dy=y+dir[i][1]; 24 if (dx>=0&&dx<m&&dy>=0&&dy<n&&!visited[dx][dy]&&board[dx][dy]==word.charAt(index+1)){ 25 visited[dx][dy]=true; 26 flag=flag||dfs(board,dx,dy,index+1,word,visited); 27 visited[dx][dy]=false; 28 } 29 } 30 return flag; 31 } 32 }
思路:对于每个节点dfs判断是否可以找到单词。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!