回溯,深度遍歷 單詞搜尋

2021-10-19 19:41:55 字數 2164 閱讀 1676

單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中「相鄰」單元格是那些水平相鄰或垂直相鄰的單元格。

同乙個單元格內的字母不允許被重複使用。

board =[[

'a',

'b',

'c',

'e'],[

's',

'f',

'c',

's'],[

'a',

'd',

'e',

'e']

]給定 word =

"abcced"

, 返回 true

給定 word =

"see"

, 返回 true

給定 word =

"abcb"

, 返回 false

同乙個單元格內的字母不允許被重複使用,那麼需求定義乙個二維陣列來儲存單元格內是否使用過

//初始化乙個二維陣列

let usedarray =

newarray(10

).fill(0

).map(()

=>

newarray(12

).fill(0

));

從第[0,0] 開始判斷是否存在, i***its

//回溯第一步,成功的條件,

//如果當前的index是單詞的長度,則說明查詢結束,return true

if(index===word.length)

//回溯第二步,失敗的條件

// 如果i,j 超過範圍,或者當前二維陣列的值不等於單詞長度的當前值或者當前但是已經被使用,則 return false

if(i<

0|| j<

0|| i>= row || j>= col || board[i]

[j]!== word[index]

|| flag[i]

[j])

//處理無重複單詞,置為true
//回溯第三步,遞迴,上下左右繼續呼叫if(

helper

(i+1

,j,index+1)

||helper

(i-1

,j,index+1)

||helper

(i,j+

1,index+1)

||helper

(i,j-

1,index+1)

)

完整**:

if

(board==

null

||board.length==0)

let row = board.length;

let col = board[0]

.length;

let flag =

newarray

(row)

.fill(0

).map(()

=>

newarray

(col)

.fill(0

));let

helper

=(i,j,index)

=>

if(i<

0|| j<

0|| i>= row || j>= col || board[i]

[j]!== word[index]

|| flag[i]

[j])

flag[i]

[j]=

true;if

(helper

(i+1

,j,index+1)

||helper

(i-1

,j,index+1)

||helper

(i,j+

1,index+1)

||helper

(i,j-

1,index+1)

) flag[i]

[j]=

false

;return

false;}

;for

(let i=

0;i}return

false

;

深度優先遍歷 回溯 79 單詞搜尋

題目描述 給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。示例 board a b c e s f c s a d e e 給定 word abcce...

79 單詞搜尋(dfs 回溯)

給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。board a b c e s f c s a d e e 給定 word abcced 返回 tru...

單詞搜尋(DFS回溯實現)

給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。示例 board a b c e s f c s a d e e 回溯可參考 全排列 dfs回溯實現 ...