LeetCode-單詞搜尋-31
阿新 • • 發佈:2018-10-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; } }