LeetCode 79. 单词搜索(dfs)

  1. 单词搜索
    给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例 1:

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true
示例 2:

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “SEE”
输出:true
示例 3:

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCB”
输出:false

提示:

m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board 和 word 仅由大小写英文字母组成

注:通过对board的遍历让每一个字母都进入回溯back,去寻找是否有满足当前条件下的子串。如果找到直接返回true,如果没找到就更换字母继续进行回溯。对于每个字母的话,有4个选择,判断其左右上下的字母是否与word中的字符对应,如果对应则继续进行寻找,不对应就直接返回false。
back中就是模拟操作,如果选择了当前字母,对于当前字母的位置的used就要变为true,如果一个字母的上下左右都不满足,则要将其used的标识进行改变为false,因为该字母还可以作为其他字母的上下左右字母被进行选择。

class Solution {
 
    public  boolean exist(char[][] board, String word) {
        boolean ans = false;
        int m = board.length;
        int n =board[0].length;
        boolean[][] used = new boolean[m][n];
        System.out.println(m+" "+n);
        for(int i=0;i<m;i++){
            for(int j =0;j<n;j++){
                boolean f = back(m,n,0,i,j,used,board,word);
                if(f){
                    return true;
                }
            }
        }
        return false;
    }

    public static boolean back(int m,int n, int index, int row, int col, boolean[][] used, char[][] board, String word) {
//        System.out.println(index);
        if (board[row][col] != word.charAt(index)) {
            return false;
        }
        if (index == word.length()-1) {
            return true;
        }
        if (board[row][col] == word.charAt(index)) {
            used[row][col] = true;
            //左边
            if (col - 1 >= 0 && !used[row][col-1]) {
                if (back(m,n, index + 1, row, col - 1, used, board, word)) {
                    used[row][col] = false;
                    return true;
                }
            }
            //右边
            if (col + 1 < n && !used[row][col+1]) {
                if (back(m,n, index + 1, row, col + 1, used, board, word)) {
                    used[row][col] = false;
                    return true;
                }
            }
            //上边
            if (row - 1 >= 0 && !used[row-1][col]) {
                if (back(m,n, index + 1, row - 1, col,  used, board, word)) {
                    used[row][col] = false;
                    return true;
                }
            }
            //下边
            if (row + 1 < m  && !used[row+1][col] ) {
                if (back(m,n, index + 1, row + 1, col, used, board, word)) {
                    used[row][col] = false;
                    return true;
                }
            }
        }
        used[row][col] = false;
        return false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

超好的小白

没体验过打赏,能让我体验一次吗

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

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

打赏作者

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

抵扣说明:

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

余额充值