212 單詞搜尋 II

2021-09-26 10:48:25 字數 1443 閱讀 1313

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