算法:矩陣中的路徑

給定一個 m x n 二維字符網(wǎng)格 board 和一個字符串都是單詞 word 。如果 word 存在于網(wǎng)格中,返回 true ;否則,返回 false 。
單詞必須按照字母順序,通過相鄰的單元格內(nèi)的字母構(gòu)成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內(nèi)的字母不允許被重復使用。
例如,在下面的 3×4 的矩陣中包含單詞 "ABCCED"(單詞中的字母已標出)。

示例
輸入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
輸出:true
提示
1 <= board.length <= 200
1 <= board[i].length <= 200
board 和 word 僅由大小寫英文字母組成
解題思路
本問題是典型的矩陣搜索問題,可使用 深度優(yōu)先搜索(DFS)+ 剪枝 解決。
深度優(yōu)先搜索: 可以理解為暴力法遍歷矩陣中所有字符串的可能性。DFS 通過遞歸,先朝一個方向搜到底,再回溯至上個節(jié)點,沿另一個方向搜索,以此類推。
剪枝: 在搜索中,遇到 這條路不可能和目標字符串匹配成功 的情況(例如:此矩陣元素和目標字符不同、此元素已被訪問),則應立即返回,稱之為 可行性剪枝 。
示例說明

第一次操作:當前值為 A ,我們遍歷他的上下左右四個方向的單詞,發(fā)現(xiàn)右側(cè)是 B ,滿足條件;
第二次操作:從 B 開始遍歷四個方向,發(fā)現(xiàn)他的右側(cè)是 C ,滿足條件;
第三次操作:從 C 開始遍歷四個方向,發(fā)現(xiàn)他的下側(cè)是 C ,滿足條件;
第四次操作:從 C 開始遍歷四個方向,發(fā)現(xiàn)他的下側(cè)是 E ,滿足條件;
第五次操作:從 E 開始遍歷四個方向,發(fā)現(xiàn)他的左側(cè)是 D ,滿足條件;
第六次操作:發(fā)現(xiàn) D 滿足數(shù)組的 len(word) - 1 ,即字符串完全匹配,退出。
代碼如下:

復雜度分析
M, N 分別為矩陣行列大小, K 為字符串 word 長度。
時間復雜度: 最差情況下,需要遍歷矩陣中長度為 KK 字符串的所有方案,時間復雜度為 O(3的K次方);矩陣中共有 MN 個起點,時間復雜度為 O(MN) 。
方案數(shù)計算: 設(shè)字符串長度為 K ,搜索中每個字符有上、下、左、右四個方向可以選擇,舍棄回頭(上個字符)的方向,剩下 3 種選擇,因此方案數(shù)的復雜度為 O(3的K次方)。
空間復雜度: 搜索過程中的遞歸深度不超過 K ,因此系統(tǒng)因函數(shù)調(diào)用累計使用的??臻g占用 O(K)(因為函數(shù)返回后,系統(tǒng)調(diào)用的??臻g會釋放)。最壞情況下 K = MN,遞歸深度為 MN ,此時系統(tǒng)棧使用 O(MN) 的額外空間。
END
本文內(nèi)容出處是力扣官網(wǎng),希望和大家一起刷算法,在后面的路上不變禿但是變強!
好兄弟可以點贊并關(guān)注我的公眾號“javaAnswer”,全部都是干貨。
