力扣—79单词搜索(回溯算法)

一.题目

题目分析:要求我们在一个二维矩阵中寻找一个单词,如果找到返回true,找不到返回false

这道题用dfs和bfs都可以解决,都是通过遍历所有结果,来查询

代码如下:

class Solution {
    public static int[] dx = {0,1,0,-1};
    public static int[] dy = {1,0,-1,0};
    //右,下,左,上
    public boolean exist(char[][] board, String word) {
        boolean[][] mark = new boolean[board.length][board[0].length];
        String s = "";
        if (board == null || board.length == 0 || word == null || word.length() == 0) {
            return false;
        }
        for(int i = 0;i<board.length;i++)
        {
            for(int j = 0;j<board[i].length;j++)
            {
                if(board[i][j]==word.charAt(0))
                {
                    int index = 0;
                    if(dfs(i,j,word,board,mark,index+1))
                        return true;
                }
            }
        }
        return false;
    }
    public static boolean dfs(int x,int y,String word,char[][] bord,boolean[][] mark,int index)
    {
        if(index==word.length())
            return true;
        
        mark[x][y] = true;
        for(int i = 0;i<4;i++)
        {
            int xx = x + dx[i];
            int yy = y + dy[i];
            if(cheak(xx,yy,mark))
            {
                if(bord[xx][yy] == word.charAt(index))
                {
                    if(dfs(xx,yy,word,bord,mark,index+1))
                        return true;
                }
            }
        }
        mark[x][y] = false;
        return false;
    }
    public static boolean cheak(int x,int y,boolean[][] mark)//减枝
    {
        if(x<0||x>=mark.length||y<0||y>=mark[0].length||mark[x][y]==true)
            return false;
        return true;
    }
}

首先定义方向向量,来进行上下左右四个方向的搜素,遍历整个二维数组,如果对应的下标是单词的首个字母,那么就进行dfs遍历从当前位置的所有可能

为什么将dfs的返回值定义为boolean类型?

1.一开始错误在于将dfs返回值定义为int类型,定义为int是因为index是基本数据类型,无法在传参过程中改变index的值,后面想着用int作为返回值,又犯了一个错,在递归回溯过程中,有可能没有递归到最后一个结果就提前return了

如图所示,返回的可能是中间值

四个方向都不通,返回的是错误结果,递归没有遍历全部

2.错误2将访问过的条件语句写错位置

3.错误3没有对临界值进行处理

cheak作用是减枝,避免不必要的递归

dfs算法核心:

1.确定递归结束语句,题目要求的答案位置

2.进行递归的位置,符合题目的约束条件

3.回溯语句写在哪里(递归之后)

5.想清楚回溯和方法的条件语句

4.参数的传递,像递归这种操作,最好将参数传递进行,不要使用全局变量,很容易在递归中发生错误,很难找

5.减枝,减少时间复杂度,避免不必要的递归

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值