題目描述:
請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格仔。例如,在下面的
3×4的矩陣中包含一條字串
「bfce」
的路徑(路徑中的字母用加粗標出)。
[["a","b","c","e"],
["s","f","c","s"],
["a","d","e","e"]]
但矩陣中不包含字串
「abfb」
的路徑,因為字串的第乙個字元
b佔據了矩陣中的第一行第二個格仔之後,路徑不能再次進入這個格仔。
解題思路:
dfs:
演算法原理:
1,深度優先搜尋可理解為暴力法遍歷矩陣中所有字串可能性,
dfs通過遞迴,先朝乙個方向搜尋到底,再回溯至上乙個節點,沿另乙個方向搜尋,以此類推,
2,剪枝:在搜尋過程中,遇到這條路不可能和目標字串匹配成功的情況,則立即返回
演算法步驟:
遞迴引數:當前元素在矩陣中的行和列索引
,當前目標字元在
word
中的索引k
終止條件:
1,返回
false:
行和列越界,或者
當前矩陣元素與目標字元不同, 2
,返回true:
字串已經全部匹配,即
k=len(word)-1
遞推工作:
1,標記當前矩陣元素:將
board[i][j]
值暫存變數tmp中,防止重複訪問,修改字元board[i][j]
值為「/」, 2
並記錄結果至
res. 3
,返回當前矩陣元素,將
tmp暫存值還原至
board[i][j]元素
回溯返回值:返回
res,
代表是否搜尋到目標字串
def exist(board,word):
def dfs(i,j,k):
if not 0<=iif k == len(word) - 1:return true
tmp,board[i][j] = board[i][j],"/"
res = dfs(i+1,j,k+1) or dfs(i-1,j,k+1) or dfs(i,j+1,k+1) or dfs(i,j-1,k+1)
board[i][j] = tmp
return res
for i in range(len(board)):
for j in range(len(board[0])):
if dfs(i,j,0):return true
return false
print(exist(board = [["a","b","c","e"],["s","f","c","s"],["a","d","e","e"]], word = "abcced"))
面試題12 矩陣中的路徑
題目 請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有 字元的路徑。路徑可以從矩陣中任意一格開始,每一步可以在矩陣中向左 右 上 下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入 該格仔。例如在下面的3 4的矩陣中包含一條字串 bfce 的路徑 路徑中的字 母用下劃線...
面試題12 矩陣中的路徑
請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左 右 上 下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格仔。例如,在下面的3 4的矩陣中包含一條字串 bfce 的路徑 路徑中的字母用下劃線標出 但...
面試題12 矩陣中的路徑
採用深度優先遍歷的策略,從深度方向進行匹配,如果相等則返回true,否則返回false。像這種遞迴的解法,重要的是要分析出邊界,分析出一次搜尋要做什麼事情。邊界或者返回條件 當前搜尋的字元超越矩陣邊界,或者該字元與word對應字元不相等,同時要求不走相同的路。此時,返回false。如果滿足上述三個條...