79. 单词搜索(JS实现)

1 题目

给定一个二维网格和一个单词,找出该单词是否存在于网格中。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用
示例:
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

2 思路

这道题的思路主要还是考察深度优先遍历 + 回溯, 主要思路就是遍历二维数组每个元素,当发现元素和目标单词的首字母相同时,就进入递归,沿该元素的四个方向进行依次查找,用一个散列表标记已经访问过的位置,在递归过程中,若找到则返回true,若未找到,则递归回来时,要重置散列表状态

3代码

/**
 * @param {character[][]} board
 * @param {string} word
 * @return {boolean}
 */
var exist = function(board, word) {

    let m = board.length;
    let n = board[0].length;

    if (m * n < word.length) return false;

    let map = {};

    for (let i=0; i<m; i++) {
        for (let j=0; j<n; j++) {
            if (board[i][j] === word[0]) {
                if (search(i,j,0)) return true;
            }
        }
    }

    return false;


    function search(i, j, nextIndex) {
		//单词已遍历完,则表明已经找到了
        if (nextIndex === word.length) {
            return true;
        };

        let key = `${i}-${j}`;
		//数组越界、已经访问过、对应字母不相等时直接返回false
        if (i < 0 || j < 0 || i >= m || j >=n || map[key] || board[i][j] !== word[nextIndex]) { 
            return false;
        }

        map[key] = true;

        let success = search(i+1, j, nextIndex + 1)  //沿4个方向寻找
        || search(i-1, j, nextIndex + 1)
        || search(i, j+1, nextIndex + 1)
        || search(i, j-1, nextIndex + 1);

        map[key] = success;  //失败时要重置位置状态

        return success;
    }
};

猜你喜欢

转载自blog.csdn.net/zjw_python/article/details/106751929
今日推荐