面試題12 矩陣中的路徑

2021-10-04 04:45:28 字數 1643 閱讀 2344

題目描述:

請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格仔。例如,在下面的

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。如果滿足上述三個條...