LeetCode一刷:回溯算法-单词搜索

题目:

单词搜索
给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]

给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false
 

提示:

board 和 word 中只包含大写和小写英文字母。
1 <= board.length <= 200
1 <= board[i].length <= 200
1 <= word.length <= 10^3

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xvkwe2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

分析:

深度优先搜索+递归回溯

代码:

/**
 * @param {Array} tempList
 * 
 * 
 */
var dfs = function(tempList, board, word, index, i, j, flag){
    if(flag[i][j]) return;
    if(board[i][j] === word[index]){
        flag[i][j]  = true;
        tempList.push(board[i][j]);

        if(tempList.length === word.length) return true;
      
/* 上下左右四个方向搜索,遇到flag[i][j]标记为true就直接返回,表明已搜索过 */
if(i+1<board.length) { if(dfs(tempList, board, word, index+1, i+1, j, flag)){ return true; } } if(i-1>=0) { if(dfs(tempList, board, word, index+1, i-1, j, flag)){ return true; } } if(j+1<board[0].length) { if(dfs(tempList, board, word, index+1, i, j+1, flag)){ return true; } } if(j-1>=0) { if(dfs(tempList, board, word, index+1, i, j-1, flag)){ return true; } } tempList.pop(); flag[i][j] = false; } }; /** * @param {character[][]} board * @param {string} word * @return {boolean} */ var exist = function(board, word) { var row = board.length; var col = board[0].length; var flag = new Array(row); for(let i=0; i<row; i++) { let a = []; for(let j=0; j<col; j++) { a[j] = false; } flag[i] = a; } let res = false; for(let i=0; i<row; i++) { for(let j=0; j<col; j++) { if(dfs([], board, word, 0, i, j, flag)){ return true; } } } return false; };
原文地址:https://www.cnblogs.com/davidxu/p/13660482.html