題目描述
給定乙個二維網格 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...