LeetCode212 單詞搜尋 II

2021-09-30 00:27:40 字數 2695 閱讀 6754

題目描述

給定乙個二維網格 board 和乙個字典中的單詞列表 words,找出所有同時在二維網格和字典**現的單詞。

單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中「相鄰」單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母在乙個單詞中不允許被重複使用。

示例:輸入:

words =

["oath"

,"pea"

,"eat"

,"rain"

] and board =[[

'o',

'a',

'a',

'n'],[

'e',

't',

'a',

'e'],[

'i',

'h',

'k',

'r'],[

'i',

'f',

'l',

'v']

]

輸出:["eat","oath"]

說明:你可以假設所有輸入都由小寫字母 a-z 組成。

你需要優化回溯演算法以通過更大資料量的測試。你能否早點停止回溯?

如果當前單詞不存在於所有單詞的字首中,則可以立即停止回溯。什麼樣的資料結構可以有效地執行這樣的操作?雜湊表是否可行?為什麼? 字首樹如何?如果你想學習如何實現乙個基本的字首樹,請先檢視這個問題: 實現trie(字首樹)。

思路:建立字典樹,然後查詢

建立字典樹:遍歷字串陣列,將每個元素插入到trienode中;

插入元素之前建立字典樹的資料結構,因為在本題中只需要插入操作,所以簡化trienode;

在插入過程中每個節點存的只是乙個字元,直到當前字串的每乙個字元都遍歷過(放在字典樹的節點上,isend用來標誌是否為完整字串),將最後乙個節點的val設定為當前字串(以便於查詢過程中儲存);

查詢:

遍歷二維字元陣列,且新建乙個boolean的二維陣列用來標誌當前字元是否已訪問過;

遞迴呼叫find(i,j,node)查詢,因為題目規定為四聯通圖所以可以直接羅列出遞迴組;

遞迴中,將visited [i] [j] 置為true,表示已經訪問過;

node = node.child[board[i][j] - 'a'];

如果當前字元在trie中存在就繼續遞迴查詢當前字元在board中能到達的位置;

直到node.isend = true,將node.val存入set中,且返回visited的狀態置為false;

如果不存在將visited[i] [j] 返回false狀態,且返回上層遞迴;

遞迴終止條件為陣列越界或者當前節點已經被訪問過;

**:

public

class

findwords212

setresult =

newhashset

<

>()

;int m = board.length;

int n = board[0]

.length;

boolean

visited =

newboolean

[m][n]

;for

(int i =

0; i < m; i++)}

system.out.

println

(result)

;return

newlinkedlist

(result);}

private

void

find

(char

board,

boolean

visited,

int i,

int j,

int m,

int n, set

result,

trienode212 node)

node = node.child[board[i]

[j]-

'a']

; visited[i]

[j]=

true;if

(node == null)

if(node.isend)

find

(board, visited, i +

1, j, m, n, result, node)

;find

(board, visited, i, j +

1, m, n, result, node)

;find

(board, visited, i, j -

1, m, n, result, node)

;find

(board, visited, i -

1, j, m, n, result, node)

; visited[i]

[j]=

false;}

}class

wordtrie

else

} node.isend =

true

; node.val = word;}}

class

trienode212

}

leetcode 212 單詞搜尋II

題目 我的思路 使用回溯,重要是剪枝,這點可以讓程式不用花太多時間做無用功。我的解答 class solution for int i 0 i position.size i used new int board.length board 0 length used x y 0 已被使用 retur...

LeetCode212 單詞搜尋 II

這題是leetcode79.單詞搜尋的高階版,第79題是在二維的char陣列裡搜尋單個單詞,這題需要在二維char陣列裡搜尋一組單詞。理論上只需要對遍歷單詞陣列,逐個套用79的dfs方法即可,不過這題題目要求了需要用trie樹做優化。所以,我們最開始可以把單詞列表裡的所有單詞都插入到乙個trie樹中...

212 單詞搜尋 II

給定乙個二維網格 board 和乙個字典中的單詞列表 words,找出所有同時在二維網格和字典 現的單詞。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母在乙個單詞中不允許被重複使用。示例 輸入 words oath pea...