LeetCode - 79. Word Search

这道题目的总体思路算是比较清晰,使用双重循环迭代给出的matrix的每一个元素,在遇到每个元素的时候检测从当前这个元素向四个方向出发的单词是不是存在。根据上面的思路我们将检测从当前这个元素出发四个方向的单词是不是存在这一过程写成另外一个函数,并且让它在第一步的函数中被调用。

在matrix中从某个元素开始,寻找单词是否存在的路径的时候,我们需要将已经访问过的元素标记为不能访问,这里可以使用另外一个与matrix一样大小的boolean matrix,但是用这种方法的话消耗的空间太多,这里我们使用了另外一个更加有技巧性的方法,就是Bit Mask。256的二进制表示是11111111,所以将当前元素 XOR 256会得到将当前的元素遮盖起来(即得到一个非字母字符的表示),注意在搜索过后,需要将被遮盖的元素重新恢复过来,从而不影响下一次的重新搜索,这时候只要再进行一次 XOR 256即可。

另外这道题目也使用了DFS的方法,代码如下:

public class Solution {
    public boolean exist(char[][] board, String word) {
        if(board == null || board.length == 0 || board[0].length == 0) return false;
        
        char[] chars = word.toCharArray();
        for(int x = 0; x < board.length; x++){
            for(int y = 0; y < board[x].length; y++){
                if(dfs(board, x, y, chars, 0)) return true;
            }
        }
        return false;
    }
    
    private boolean dfs(char[][]board, int x, int y, char[] chars, int i){
        if(i == chars.length) return true;
        if(x < 0 || y < 0 || x == board.length || y == board[x].length) return false;
        if(board[x][y] != chars[i]) return false;
        
        board[x][y] ^= 256;
        boolean exist = dfs(board, x + 1, y, chars, i + 1) ||
                        dfs(board, x, y + 1, chars, i + 1) ||
                        dfs(board, x - 1, y, chars, i + 1) ||
                        dfs(board, x, y - 1, chars, i + 1);
        board[x][y] ^= 256;
        return exist;
    }
}


知识点:

1. Bit Mask的使用 XOR 256 XOR 256

2. DFS的使用还是非常不成熟,还要多看看与这道题目类似的题目多多体会一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值