1. 程式人生 > 其它 >JZ65 矩陣中的路徑

JZ65 矩陣中的路徑

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