【leetcode】79.单词搜索

106 阅读2分钟

leetcode.png

题目简述:在给定的字母矩阵之中找到连续的word。

其实这一题跟岛屿的题目很像,都是四个方向上去探寻。岛屿的操作就是要给岛屿淹没,这一题的操作就需要标记已经使用过的字母,如果不满足条件,然后再进行回溯。

跟所有回溯的写法相同,在递归调用的前面进行操作,后面进行复原操作,只不过这里的递归的操作就是4个操作了。

如果可以重复使用字母,可以去掉做标记的代码(11、13、19行代码)即可

var exist = function (board, word) {
    let row = board.length
    let col = board[0].length
    var dfs = function (i, j, index) {
        // 遍历到最后一个字母,找到满足条件的
        if (index === word.length) return true
        // 越界
        if (i < 0 || i >= row || j < 0 || j >= col) return false
        // 当前字母不匹配
        if (board[i][j] !== word[index]) return false
        let tmp = board[i][j]
        // 给字母打标记,表示已经用过
        board[i][j] = '#'
        let found = dfs(i - 1, j, index + 1) ||
                    dfs(i + 1, j, index + 1) ||
                    dfs(i, j - 1, index + 1) ||
                    dfs(i, j + 1, index + 1)
        // 回溯
        board[i][j] = tmp
        return found
    }
    for (let i = 0; i < row; ++i) {
        for (let j = 0; j < col; ++j) {
            // 满足首个字母相同,则进入dfs进行四个方向上的递归
            if (board[i][j] === word[0]) {
                // 递归条件满足,return true
                if (dfs(i, j, 0)) {
                    return true
                }
            }
        }
    }
    return false
};

如果要记录路径,就直接在递归的前后进行记录还有复原即可

var exist = function(board, word) {
    let row = board.length;
    let col = board[0].length;
    let path = []; // 用于记录路径

    // DFS辅助函数
    var dfs = function(i, j, index) {
        if (index === word.length) return true; // 找到单词
        if (i < 0 || i >= row || j < 0 || j >= col || board[i][j] !== word[index]) return false; // 越界或字符不匹配

        // 保存当前字符并标记为已访问
        let temp = board[i][j];
        board[i][j] = '#';
        path.push([i, j]); // 记录当前路径

        // 继续搜索相邻的四个方向
        let found = dfs(i - 1, j, index + 1) ||
                    dfs(i + 1, j, index + 1) ||
                    dfs(i, j - 1, index + 1) ||
                    dfs(i, j + 1, index + 1);

        // 如果找不到,移除当前路径
        if (!found) path.pop();

        // 恢复当前字符
        board[i][j] = temp;

        return found;
    };

    // 遍历网格中的每个位置
    for (let i = 0; i < row; ++i) {
        for (let j = 0; j < col; ++j) {
            if (board[i][j] === word[0] && dfs(i, j, 0)) {
                console.log("Path: ", path); // 输出路径
                return true;
            }
        }
    }

    return false;
};