1. 程式人生 > 實用技巧 >劍指65.矩陣中的路徑

劍指65.矩陣中的路徑

思路

考察點:DFS+回溯。

回溯:回溯法非常適合由多個步驟組成的問題,並且每個步驟都有多個選項。通常回溯法適合用遞迴實現程式碼。當到達某個節點時,嘗試所有可能的選項並在滿足條件的前提下遞迴地抵達下一個節點。

深搜+回溯,深搜的過程其實就是對四個方向的一個遞迴呼叫的過程,回溯的話是為了消除某一次遞迴呼叫所產生的路徑不能匹配模式串所產生的影響要被消除掉,消除的結果就是對這條路徑上的每一個位置進行狀態初始化,即標記為未被遍歷。

解法

 1 public class Solution {
 2     public boolean hasPath(char[] matrix, int rows, int
cols, char[] str) { 3 // 先把牛客上給的條件轉化成力扣上的條件 4 char[][] board = new char[rows][cols]; 5 // 版本1:一維轉化為二維矩陣 6 for (int i = 0; i < rows; i++) { 7 for (int j = 0; j < cols; j++) { 8 board[i][j] = matrix[i*cols + j]; 9 } 10 }
11 // 版本2:一維轉化為二維矩陣 12 /*int index = 0; 13 int x = 0; 14 for (int i = 0; i < matrix.length; i++) { 15 if (index >= cols){ 16 index = 0; 17 x++; 18 } 19 board[x][index] = matrix[i]; 20 index++;
21 }*/ 22 boolean[][] vis = new boolean[board.length][board[0].length]; 23 for (int i = 0; i < board.length; i++) { 24 for (int j = 0; j < board[i].length; j++) { 25 if (find(board,String.valueOf(str),i,j,vis,0)){ 26 return true; 27 } 28 } 29 } 30 return false; 31 } 32 private boolean find(char[][] board,String word,int x, int y,boolean[][] vis, int index){ 33 // 越界處理以及每個方格只能訪問一次 34 if (x < 0 || x >= board.length || y < 0 || y >= board[0].length || vis[x][y]) 35 return false; 36 // 匹配到某一位置不滿足條件 37 if (word.charAt(index) != board[x][y]) 38 return false; 39 // 匹配成功 40 if (index == word.length() - 1) 41 return true; 42 43 vis[x][y] = true; 44 boolean flag = find(board,word,x+1,y,vis,index+1) || 45 find(board,word,x-1,y,vis,index+1) || 46 find(board,word,x,y+1,vis,index+1) || 47 find(board,word,x,y-1,vis,index+1); 48 vis[x][y] = false; //標記狀態回溯 49 return flag; 50 } 51 }