offer 12 矩陣中的路徑 矩陣搜索

矩陣中的路徑

image.png

典型的矩陣搜索問題
深度優先搜索(DFS)+ 剪枝
image.pngspa

題解

image.png
本問題是典型的矩陣搜索問題,可以使用 深度優先搜索(DFS)+ 剪枝 解決。
像是在暴力破解
一、遍歷矩陣,找到相同的字符,
二、從這個字符開始遞歸上下左右的字符,出界和與word[k+1]不等則返回false;
三、若與word[k+1]相同,且k是最後一個字符,就表示遞歸結束且有符合條件的字符串,返回true。
四、若與word[k+1]相同,但不是最後一個字符,就表示須要遞歸,這裏比較暴力了,
上下左右有一個符合的,就繼續遞歸下去,沒有符合的就中斷並返回false。從矩陣的下一個字符從新找與word的第一個字符相同的。
這裏還有一個重點!!:矩陣中的字符只能用一次,因此須要將判斷相同的字符置爲空格字符'\0'(也就是不能走回頭路,若是下一個字母和上一個字母相同的話,以前那個不爲空,就會搜索到回頭路了),那麼若是這條路走不通,即第四步其中一個循環返回了false,就須要恢復成原樣,返回上一個節點,繼續其餘方向的循環搜索。
只要有一條路true了,就返回true,全部的路都走不通了等循環結束了才返回false。code

class Solution {
    public boolean exist(char[][] board, String word) {
        char[] words = word.toCharArray();
        for(int i = 0; i < board.length; i++) {
            for(int j = 0; j < board[0].length; j++) {
                if(dfs(board, words, i, j, 0)) return true;
            }
        }
        return false;
    }
    boolean dfs(char[][] board, char[] word, int i, int j, int k) {
        if(i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] != word[k]) return false;
        if(k == word.length - 1) return true;
        board[i][j] = '\0';
        boolean res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) || 
                      dfs(board, word, i, j + 1, k + 1) || dfs(board, word, i , j - 1, k + 1);
        board[i][j] = word[k];
        return res;
    }
}
相關文章
相關標籤/搜索