leetcode题解-79. Word Search

本文介绍了一种通过深度优先搜索(DFS)在二维网格中查找指定单词的方法。文章详细阐述了如何利用递归和位运算避免字母重复使用的问题,并提供了一个完整的Java实现案例。

题目:

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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值