leetcode题解-79. Word Search

来源:互联网 发布:网络平台运营成本预算 编辑:程序博客网 时间:2024/04/28 12:31

题目:

Given a 2D board and a word, find if the word exists in the grid.The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.For example,Given board =[  ['A','B','C','E'],  ['S','F','C','S'],  ['A','D','E','E']]word = "ABCCED", -> returns true,word = "SEE", -> returns true,word = "ABCB", -> returns false.

本题是从一个board中寻找一个单词,很容易想到深度遍历的方法,但是如何解决不能重复使用这一限制条件呢,我们可以使用额外的空间来标识,也可以使用两次亦或操作,第一次表明该字符不可用,第二次在使之可用即可。代码入下:

    public boolean exist(char[][] board, String word) {        if (word == null || word.length() == 0) {            return true;        }        char[] chs = word.toCharArray();        //遍历面板所有字符        for (int i = 0; i < board.length; i++) {            for (int j = 0; j < board[0].length; j++) {                //dfs判断是否满足题目要求                if(dfs(board, chs, 0, i, j)) {                    return true;                }            }        }        return false;    }    private boolean dfs(char[][] board, char[] words, int idx, int x, int y) {        //如果idx==单词长度则说明已经找到了完整的单词,返回真        if (idx == words.length) {            return true;        }        //如果下标越界,返回假        if (x < 0 || x == board.length || y < 0 || y == board[0].length) {            return false;        }        //如果遍历的字符不等于单词中对应位置的字符,返回假        if (board[x][y] != words[idx]) {            return false;        }        //亦或操作,是现在判断的字符不可用,以免被重复使用        board[x][y] ^= 256;        //递归调用,判断该字符串前后左右四个字符是否满足条件,有一个为真即可继续递归调用判断单词的下一个字符        boolean exist = dfs(board, words, idx + 1, x, y + 1) ||                dfs(board, words, idx + 1, x, y - 1) || dfs(board, words, idx + 1, x + 1, y) ||                dfs(board, words, idx + 1, x - 1, y) ;        //再次亦或使该字符可用        board[x][y] ^= 256;        return exist;    }
0 0