請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格仔。例如,在下面的3×4的矩陣中包含一條字串「bfce」的路徑(路徑中的字母用加粗標出)。
[[「a」,「b」,「c」,「e」],
[「s」,「f」,「c」,「s」],
[「a」,「d」,「e」,「e」]]
但矩陣中不包含字串「abfb」的路徑,因為字串的第乙個字元b佔據了矩陣中的第一行第二個格仔之後,路徑不能再次進入這個格仔。
示例 1:
輸入:board = [[「a」,「b」,「c」,「e」],[「s」,「f」,「c」,「s」],[「a」,「d」,「e」,「e」]], word = 「abcced」
輸出:true
示例 2:
思路:
對矩陣進行深度優先遍歷,dfs 通過遞迴,先朝乙個方向搜到底,再回溯至上個節點,沿另乙個方向搜尋,以此類推。
在搜尋中,遇到這條路不可能和目標字串匹配成功的情況,則應立即返回。
我們將遍歷過的元素做標記,不能再次訪問。
遞迴的終止條件:
(1) 行或列索引越界;
(2)當前矩陣元素與目標字元不同;
(3)當前矩陣元素已訪問過。
例如示例1,目標字串word為「abcced」。從矩陣左上角開始遍歷元素,dfs遍歷方向為「上、下、左、右」。a
bces
fcsa
dee此時a已經被遍歷,與目標字串的第乙個字元「a」相同,接著匹配目標字串的第二個字元「b」,矩陣再往下遍歷有幾種情況:
(1)如果向下遍歷時,『s』 ≠ 『b』,與目標字串不匹配,則返回false;
(2)如果向上遍歷時,索引越界,則返回false;
(3)向右遍歷時,『b』 = 『b』,則將』b』標記為已訪問狀態。a
bces
fcsa
dee接著匹配目標字串的第三個字元『c』,從矩陣』b』往下遍歷時:
(1)如果向下遍歷時,『f』 ≠ 『b』,與目標字串不匹配,則返回false;
(2)如果向上遍歷時,索引越界,則返回false;
(3)向右遍歷時,『c』 = 『c』,則將』c』標記為已訪問狀態。a
bces
fcsa
dee接著匹配目標字串的第四個字元『c』,從矩陣』c』往下遍歷時,與以上步驟相同,最後『c』向下遍歷時,才能匹配到目標字串裡的『c』。a
bces
fcsa
dee接著匹配目標字串的第五個字元『e』,與以上步驟相同,從『c』向下遍歷時,才能匹配到目標字串裡的「e」。a
bces
fcsa
dee接著匹配目標字串的第六個字元『d』,從矩陣』e』往下遍歷時:
(1)向下遍歷時,索引越界,返回false;
(2)向上遍歷時,『e』上方的字元已經被訪問過了,返回false;
(3)向右遍歷時,訪問到的字元『e』 ≠ 『d』,返回false;
(4)向左遍歷時,訪問到的字元『d』 = 『d』,將字元『d』設定為已訪問狀態。a
bces
fcsa
dee此時當前字串的索引為word.length ,即字串已經全部匹配完畢,返回true。
class
solution
boolean
marked =
newboolean
[m][n]
;char
arr = word.
tochararray()
;for
(int i =
0; i < board.length; i++)}
}return
false;}
private
boolean
dfs(
char
board,
int i,
int j,
boolean
marked,
char
arr,
int index)
if(i <
0|| j <
0|| i == board.length || j == board[0]
.length
|| marked[i]
[j]|| board[i]
[j]!= arr[index]
) marked[i]
[j]=
true
;boolean res =
dfs(board, i +
1, j, marked, arr, index +1)
||dfs
(board, i -
1, j, marked, arr, index +1)
||dfs
(board, i, j +
1, marked, arr, index +1)
||dfs
(board, i, j -
1, marked, arr, index +1)
; marked[i]
[j]=
false
;return res;
}}
CUDA學習(四十一)
表面功能 在下面的部分中,boundarymode指定邊界模式,即處理超出範圍的表面座標的方式 它等於cudaboundarymodeclamp 在這種情況下,超出範圍的座標被鉗位到有效範圍 或cudaboundarymodezero 在這種情況下超出範圍的讀取返回零並且超出範圍的寫入被忽略 或cu...
(四十一)auto命令
當我們給變數宣告時,通常採用int,或者double等整型或者浮點型別來宣告,例如int a double b 等。當我們遇見乙個常量,也可以用另外一種方法進行宣告。在c 11後方能使用。但是怎麼知道是不是c 11 那就是auto,例如 auto a 1 當使用auto的時候,編譯器會根據值自動賦予...
機器學習基礎(四十一) KNN
所謂 k 近鄰的數學表達,也即統計計數 再進行表決 的數學表達。y argmaxcj xi nk x i y i cj i 1,2,n j 1,2,k k 值的選擇會對 k 近鄰法的結果產生重大影響。如果選擇較小的 k 值,就相當於用較小的鄰域中的訓練例項 xi nk x 如果選擇較大的 k 值,將...