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判断是否可以找到单词。