Leetcode 79. 單詞搜索 --javascript DFS

79. 單詞搜索

描述

給定一個 m x n 二維字符網格 board 和一個字符串單詞 word 。若是 word 存在於網格中,返回 true ;不然,返回 false 。javascript

單詞必須按照字母順序,經過相鄰的單元格內的字母構成,其中「相鄰」單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不容許被重複使用。java

image.png

image.png

image.png 提示:markdown

m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board 和 word 僅由大小寫英文字母組成
複製代碼

題解

回溯法

回溯法(backtracking)是優先搜索的一種特殊狀況,又稱爲試探法,經常使用於須要記錄節點狀態的深度優先搜索。一般來講,排列、組合、選擇類問題使用回溯法比較方便。 顧名思義,回溯法的核心是回溯。在搜索到某一節點的時候,若是咱們發現目前的節點(及其子節點)並非需求目標時,咱們回退到原來的節點繼續搜索,而且把在目前節點修改的狀態 還原。函數

這樣的好處是咱們能夠始終只對圖的總狀態進行修改,而非每次遍歷時新建一個圖來儲存 狀態。 在具體的寫法上,它與普通的深度優先搜索同樣,都有 [修改當前節點狀態]→[遞歸子節 點] 的步驟,只是多了回溯的步驟,變成了 [修改當前節點狀態]→[遞歸子節點]→[回改當前節點 狀態]。 回溯法。有兩個小訣竅,一是按引用傳狀態,二是全部的狀態修 改在遞歸完成後回改。 回溯法修改通常有兩種狀況,一種是修改最後一位輸出,好比排列組合;一種是修改訪問標 記,好比矩陣裏搜字符串。ui

解析

不一樣於排列組合修改輸出方式,而是修改訪問標記。spa

在咱們對任意位置進行深度優先搜索時,咱們先標記當前位置爲已訪問,以免重複遍歷(如防止向右搜索後 又向左返回);code

在全部的可能都搜索完成後,再回改當前位置爲未訪問,防止干擾其它位置搜索 到當前位置。orm

使用回溯法,咱們能夠只對一個二維的訪問矩陣進行修改,而不用把每次的搜索狀 態做爲一個新對象傳入遞歸函數中。對象

coding

/** * @param {character[][]} board * @param {string} word * @return {boolean} */
const direction = [-1, 0, 1, 0, -1];
const exist = function(board, word) {
   if(!board.length) return false;
   let m = board.length, n = board[0].length;
   let visited = Array.from({length: m}, ()=> Array(n).fill(false));
   const find = {flag:false};
   for(let i = 0; i < m; i++) {
       for(let j = 0; j < n; j++) {
            backtracking(i, j, board, word, find, visited, 0);
       }
   }
   return find.flag;
};
const backtracking = function(i, j, board, word, find,visited, pos) {
    if(i < 0 || i >= board.length || j < 0 || j >= board[0].length) {
        return;
    } 
    if(visited[i][j] || (board[i][j] !== word[pos]) || find.flag) {
        return;
    }
    if(pos === word.length - 1) {
      find.flag = true
      return;
    }
    visited[i][j] = true; // 修改當前節點狀態。
     for(let k = 0; k < 4; k++){
         const dx = i + direction[k];
         const dy = j + direction[k+1];
         backtracking(dx, dy, board, word,find, visited, pos + 1);
     }
     visited[i][j] = false; // 恢復節點狀態;

}

複製代碼
相關文章
相關標籤/搜索