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的使用还是非常不成熟,还要多看看与这道题目类似的题目多多体会一下

你可能感兴趣的:(leetcode)