劍指 12 矩陣中的路徑

2021-10-10 03:07:54 字數 1750 閱讀 7576

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

[[「a」,「b」,「c」,「e」],

[「s」,「f」,「c」,「s」],

[「a」,「d」,「e」,「e」]]

但矩陣中不包含字串「abfb」的路徑,因為字串的第乙個字元b佔據了矩陣中的第一行第二個格仔之後,路徑不能再次進入這個格仔。

回溯法

可以認為是暴力法的公升級版,在乙個狀態s1_1同樣考慮其所有的動作,如果執行完所有的動作都沒有滿足題目,就回溯到前乙個狀態s0,站在s0的角度繼續看與s1_1相同地位的s1_2採取所有的動作是否能滿足題目要求。

bool

haspath

(char

*matrix,

int rows,

int cols,

char

*str)

}delete

visited;

return

false;}

bool

haspathcore

(const

char

*matrix,

int rows,

int cols,

int row,

int col,

const

char

* str,

int& pathlength,

bool

*visited)

}return haspath;

}

上面的**是劍指書上的源**,通過在haspath()中呼叫回溯函式haspathcore(),在回溯函式內部使用遞迴。思想就是判斷當前矩陣元素與字串當前元素是否相等,如果相等就遞迴呼叫自身檢視當前矩陣元素四周元素字串下一元素是否相等,如果四周的四個元素都不滿足條件,則回溯到已經匹配的上乙個節點。

class

solution

}return

false;}

bool

backtracking

(vectorchar

>>

&board,

int row,

int col, string &word,

int w)

//進入到這裡說明當前矩陣元素上下左右與字串下一元素都不匹配,將當前元素恢復原本值

board[row]

[col]

= temp;

return

false;}

};

優化**來自力扣鏈結位元組題庫 - #劍12 - 中等 - 矩陣中的路徑 - 1刷

主要是對標誌是否訪問過矩陣某一位置元素的布林矩陣進行優化,直接在原矩陣上將已經訪問過的元素修改為字串中不可能出現的字元,表示已經訪問過得元素不能再參加比較

劍指 12 矩陣中的路徑

思路源自書上的。回溯法 但是有乙個問題,我仿照書上的 自己寫了一遍,邏輯一模一樣,只是個別變數不同。但是 牛客網上 怎麼搞也通不過。用書上的 是可以通過的。對比了半天也沒發現區別所在。不知道是 的問題,還是oj的問題。我的 class solution return false bool help ...

12 劍指offer 矩陣中的路徑

關鍵點,在於回溯,如果你想往下找的話,必須用狀態改變和狀態恢復來包裹向下找的過程。你現在所在的尋找是某些尋找的分支,當你江郎才盡之時,需將狀態完全恢復。class solution 12 return false 這個方法能夠判斷,以x,y為開始位置,從第n個字母開始,有沒有路徑 public bo...

劍指offer12 矩陣中的路徑

設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某個字串所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左 右 上 下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格仔。利用回溯法的思想,除矩陣邊界上的格仔外,其它格仔都有四個相鄰的格仔,當矩陣中座標為 ro...