LeetCode-单词搜索-31

版权声明:如有转载请注明出处 https://blog.csdn.net/qq_34023751/article/details/82286260

深度优先算法,大致原理就是 从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。

 

实现深度优先算法的基本思路是递归

拿LeetCode的一道题进行举例:

题目要求

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

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

示例:

board =

[

['A','B','C','E'],

['S','F','C','S'],

['A','D','E','E']

]

给定 word = "ABCCED", 返回 true.

给定 word = "SEE", 返回 true.

给定 word = "ABCB", 返回 false.

解这道题的思路就是:

1.首先找到与匹配字符串第一个字母相同的位置

2.使用DFS算法,由于相邻单元格对于矩阵里的元素,最多有4个,所以要进行四个方向的递归,找到满足条件的轨迹

3.题目规定单元格的字母不能重复使用,所以要对遍历过的字母进行一下处理,但每次递归后要恢复该位置的字母

按照这个思路源代码如下:

class Solution {

  public  boolean exist(char[][] board, String word) {

        for (int i = 0; i < board.length; i++) {

            for (int j = 0; j < board[0].length; j++) {

                if (board[i][j] == word.charAt(0)) {

                    boolean result = dfsSearch(board, word, i, j, 0);

                    if (result) {

                        return result;

                    }

                }



            }

        }

        return false;

    }

     //深度优先算法

    public boolean dfsSearch(char[][] board, String word, int i, int j, int startIndex) {

        if (word.length() == startIndex) {

            return true;

        } else if (i < 0 || i >= board.length || j < 0 || j >= board[0].length

                || board[i][j] != word.charAt(startIndex)) {

            return false;

        }

        char temp=board[i][j];

        board[i][j]='#';

        boolean result=(dfsSearch(board,word,i-1,j,startIndex+1)

                ||dfsSearch(board,word,i+1,j,startIndex+1)

                ||dfsSearch(board,word,i,j+1,startIndex+1)

                ||dfsSearch(board,word,i,j-1,startIndex+1));

        board[i][j]=temp;

        return result;

    }

}

猜你喜欢

转载自blog.csdn.net/qq_34023751/article/details/82286260