給定乙個二維網格 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(字首樹)。
對給定單詞表建立字首樹,從矩陣每個位置開始向上下左右dfs尋找,當前遍歷過的位置置為』$』,成功查詢到的單詞在字首樹中做相應記錄,防止之後的dfs再次查詢該單詞。
class solution:
def findwords(self, board, words):
rows=len(board)
if not rows:
return
cols=len(board[0])
trie={}
res=
for word in words:
t=trie
for x in word:
if x not in t:
t.setdefault(x,{})
t=t[x]
t['end']=1
def dfs(i,j,cur_word,node):
nonlocal rows,cols,res
c=board[i][j]
if c not in node:
return
node=node[c]
if 'end' in node:
if node['end']==1:
node['end']=0
board[i][j]='$'
for ii,jj in [(0,1),(0,-1),(1,0),(-1,0)]:
xx,yy=i+ii,j+jj
if 0<=xxdfs(xx,yy,cur_word+c,node)
board[i][j]=c
for i in range(rows):
for j in range(cols):
dfs(i,j,'',trie)
return res
212 單詞搜尋II
思路 先將單詞插入到字首樹中,然後再dfs一步步去判斷下乙個要遍歷的字元是否存在字首樹中,若存在,則加入中間變數中,若當前遍歷的字串行在字典樹中組成乙個單詞,則加入ans中 不存在,則停止該方向的搜尋,因為字首不存在,則後面dfs生成的單詞均以此為字首,均不存在 在dfs時使用乙個set來儲存存在於...
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
題目描述 給定乙個二維網格 board 和乙個字典中的單詞列表 words,找出所有同時在二維網格和字典 現的單詞。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母在乙個單詞中不允許被重複使用。示例 輸入 words oat...