題解四十一

2021-10-06 16:59:19 字數 2771 閱讀 7536

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