目录

力扣79单词搜索回溯算法

目录

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

一.题目

https://i-blog.csdnimg.cn/direct/8c836e0058af4e52a43a66605a02ae75.png

题目分析:要求我们在一个二维矩阵中寻找一个单词,如果找到返回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了

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

https://i-blog.csdnimg.cn/direct/9da6b00397444d4fbcbdbf07b1f5ce79.png

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

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

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

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

dfs算法核心:

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

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

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

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

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

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