来自北大算法课的Leetcode题解:79. 单词搜索

文章介绍了一种在二维字符矩阵中通过深度优先搜索寻找特定字符串的方法。关键在于利用DFS进行遍历,并用visited数组记录已访问位置,以防止回溯到已匹配的字符。当遇到多个可选路径时,需要恢复非最优路径的visited状态。代码实现了一个从起点开始的递归搜索过程。

代码仓库Github | Leetcode solutions @doubleZ0108 from Peking University.

  • 解法1(T25% S76%):又是一道有趣的深搜问题,但比普通的搜索要难一点,首先每一位的字母都不一样且要和word对应位相同(之前一般都是1围成的岛屿这样相同的元素),因此DFS要多添加一个index位,其次每位不能重复,也就意味着如果某一次是往右一位,下次就不能再往左回来了既是这位字母和idx+2相同,因此需要引入visited数组记录哪里已经走过了。有一个点之前没遇到过,就是可能递归的过程中发现多个方向都有相同字符,到底匹配哪个才能达到全局最优解,因此如果某个方向没有最终解,要把它的visited值变回false。主循环就很简单了,如果第一个字符匹配,那么就从这里开始深搜。
var exist = function(board, word) {
    var visited = Array.from(new Array(board.length), () => new Array(board[0].length).fill(false));
    var deepin = function(x, y, i) {
        if (x<0 || y<0 || x>board.length-1 || y>board[0].length-1 || board[x][y]!=word[i] || visited[x][y]) {
            return false;
        }
        if (i==word.length-1) {
            return true;
        }
        visited[x][y] = true;
        if (deepin(x+1, y, i+1) || deepin(x-1, y, i+1) || deepin(x, y+1, i+1) || deepin(x, y-1, i+1)) {
            return true;
        } else {
            visited[x][y] = false;
            return false;
        }
    };

    for (var i=0; i<board.length; i++) {
        for (var j=0; j<board[i].length; j++) {
            if (board[i][j] == word[0]) {
                visited = Array.from(new Array(board.length), () => new Array(board[0].length).fill(false));
                var res = deepin(i, j, 0);
                if (res) {
                    return true;
                }
            }
        }
    }
    return false;
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

doubleZ0108

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值