JZ65 矩陣中的路徑
阿新 • • 發佈:2021-09-05
JZ65 矩陣中的路徑
原題連結
描述
請設計一個函式,用來判斷在一個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則該路徑不能再進入該格子。 例如$$ \begin{bmatrix} a & b & c &e \ s & f & c & s \ a & d & e& e\ \end{bmatrix}$$ 矩陣中包含一條字串"bcced"的路徑,但是矩陣中不包含"abcb"路徑,因為字串的第一個字元b佔據了矩陣中的第一行第二個格子之後,路徑不能再次進入該格子。
示例
輸入:[[a,b,c,e],[s,f,c,s],[a,d,e,e]],"abcced"
返回值:true
思路
DFS。要求矩陣的路徑,首先知道起點可能在矩陣中任何一個格子,所以需要遍歷所有格子找到word的第一個字元,然後開始深搜諸葛匹配word的各個字元,每次往上下所有四個方向探索,如果對應格子的元素不等於當前word待匹配的字元或者當前格子不合法(陣列越界)都說明當前路徑不存在,當搜尋到word最後一個字元時表示成功。每次從一個格子開始搜尋時,都要先把該格子標記為已遍歷,以便於從該格子出發的搜尋不會再重複搜尋到該格子,最後如果沒有找到路徑的話,要恢復格子原來的元素。
解答
public class Solution { public boolean hasPath(char[][] matrix, String word) { // write code here char[] chars = word.toCharArray(); // 七點不一定是 (0,0) for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[0].length; j++) { if (dfs(matrix, chars, i, j, 0)) return true; } } return false; } public boolean dfs(char[][] matrix, char[] chars, int i, int j, int k) { // 如果越界、不匹配 if (i < 0 || i >= matrix.length || j < 0 || j >= matrix[0].length || matrix[i][j] != chars[k]) return false; // 一旦走到下面的就說明當前 matrix[i][j] == chars[k] // 搜完了 if (k == chars.length - 1) return true; //開始搜尋 // 標記已經遍歷的東西 matrix[i][j] = '\0'; boolean res = dfs(matrix, chars, i + 1, j, k + 1) || dfs(matrix, chars, i, j + 1, k + 1) || dfs(matrix, chars, i - 1, j, k + 1) || dfs(matrix, chars, i, j - 1, k + 1); // 搜尋回退 matrix[i][j] = chars[k]; return res; } }
本文來自部落格園,作者:klaus08,轉載請註明原文連結:https://www.cnblogs.com/klaus08/p/15228956.html