leetcode79(单词搜索:DFS深搜)

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

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

示例:
board =
[
[‘A’,‘B’,‘C’,‘E’],
[‘S’,‘F’,‘C’,‘S’],
[‘A’,‘D’,‘E’,‘E’]
]

给定 word = “ABCCED”, 返回 true
给定 word = “SEE”, 返回 true
给定 word = “ABCB”, 返回 false

题解:进行DFS深搜,遍历二维数组,以二维数组的每个元素为起点进行深搜匹配,如果能匹配成功(能够连接字符得到与word内容相同的字符串)则返回true,如果所有起点都不能成功匹配则返回false

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(DFS(board,i,j,word,new boolean[board.length][board[0].length],0))
                    return true;
            }
        return false;

    }
    /*
     * x、y用于记录当前board数组中被匹配的字符位置。   
     * checkPos用于记录word中被匹配的字符位置,若checkPos的值为word.length(),
     * 则说明匹配成功。
     * 二维数组searched用于记录元素的状态(是否被搜索)
     */
    private boolean DFS(char[][]board,int x,int y,String word,boolean[][]searched,int checkPos){
    
    
         if(checkPos==word.length())
            return true;
        else if(board[x][y]!=word.charAt(checkPos))
            return false;
       searched[x][y]=true;
        int[][]move={
    
    {
    
    0,1},{
    
    0,-1},{
    
    1,0},{
    
    -1,0}};
        boolean result=false;
        for(int[] temp:move){
    
    
            int X=x+temp[0];
            int Y=y+temp[1];
            if(X>=0&&X<board.length&&Y>=0&&Y<board.length) {
    
    
               if (!searched[X][Y]&&DFS(board, X, Y, word, searched, checkPos + 1)){
    
    
                        result = true;
                        break;
                }
            }
        }
        searched[x][y]=false;
        return result;
    }
}

猜你喜欢

转载自blog.csdn.net/CY2333333/article/details/108569839