1. 程式人生 > >LeetCode-單詞搜尋-31

LeetCode-單詞搜尋-31

深度優先演算法,大致原理就是 從一個頂點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;

    }

}