leetcode79(単語検索:DFSディープ検索)

質問:2次元グリッドと単語を指定して、単語がグリッドに存在するかどうかを調べます。

単語はアルファベット順に並べ、隣接するセルの文字で形成する必要があります。「隣接する」セルとは、水平方向または垂直方向に隣接するセルのことです。同じセル内の文字は再利用できません。

例:
board =
[
['A'、 'B'、 'C​​'、 'E']、
['S'、 'F'、 'C​​'、 'S']、
['A'、 'D'、 'E'、 'E']
]

与えられた単語= "ABCCED"、trueを返す
与えられた単語= "SEE"、trueを返す
与えられた単語= "ABCB"、falseを返す

解決策:DFSのディープ検索を実行し、2次元配列をトラバースし、ディープ検索を実行して、2次元配列の各要素を開始点として一致させます。一致が成功した場合(文字を接続して単語の内容と同じ文字列を取得できる場合)、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