給定乙個二維網格 board 和乙個字典中的單詞列表 words,找出所有同時在二維網格和字典**現的單詞。
單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中「相鄰」單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母在乙個單詞中不允許被重複使用。
示例:
輸入:words = [「oath」,「pea」,「eat」,「rain」] and board =
[\quad
[『o』,『a』,『a』,『n』],
\quad
[『e』,『t』,『a』,『e』],
\quad
[『i』,『h』,『k』,『r』],
\quad
[『i』,『f』,『l』,『v』]
]輸出: [「eat」,「oath」]
說明:
你可以假設所有輸入都由小寫字母 a-z 組成。
你需要優化回溯演算法以通過更大資料量的測試。你能否早點停止回溯?
如果當前單詞不存在於所有單詞的字首中,則可以立即停止回溯。什麼樣的資料結構可以有效地執行這樣的操作?雜湊表是否可行?為什麼? 字首樹如何?如果你想學習如何實現乙個基本的字首樹,請先檢視這個問題: 實現trie(字首樹)。
思路:
對於此類的單詞搜尋,我們首先想到的就是字首樹,提示1中的更大資料量的測試也提示了我們使用字首樹。
對於此類需要乙個字母乙個字母按順序匹配的,我們採用深度優先遍歷,此時需要考慮dfs的邊界條件。
**:
class
solution
;
vector res;
//存放結果
trienode *root=
newtrienode()
;//字首樹根節點
//構建字首樹
void
insert
(string word)
cur=cur-
>next[s-
'a'];}
cur-
>isstr=
true
; cur-
>word=word;
}//定義深度優先搜尋
void
dfs(vector
char
>>
& board,
int i,
int j, trienode* root)
//鄰域檢測
//這個已訪問的標記需要寫在第38行return的後面,否則可能導致下一次檢測時,board中元素沒有恢復
board[i]
[j]=
'1';
int tmp_i,tmp_j;
tmp_i=i-1;
if(tmp_i>=0)
dfs(board,tmp_i,j,cur)
;
tmp_i=i+1;
if(tmp_i
size()
)dfs
(board,tmp_i,j,cur)
;
tmp_j=j-1;
if(tmp_j>=0)
dfs(board,i,tmp_j,cur)
;
tmp_j=j+1;
if(tmp_j< board[0]
.size()
)dfs
(board,i,tmp_j,cur)
;//恢復board中的元素,不要忘記
board[i]
[j]=tmp;
}
vector
findwords
(vector
char
>>
& board, vector
& words)
}return res;}}
;
簡化一下dfs:
class
solution;}
; trie* root=
newtrie()
;int m,n;
vector
int>> mark;
vector res;
void
addword
(string word)
cur-
>isword=
true
; cur-
>word=word;
}void
dfs(vector
char
>>
& board,
int i,
int j, trie* node)
mark[i]
[j]=1;
dfs(board,i-
1,j,node-
>next[ind]);
dfs(board,i+
1,j,node-
>next[ind]);
dfs(board,i,j-
1,node-
>next[ind]);
dfs(board,i,j+
1,node-
>next[ind]);
mark[i]
[j]=0;
} vector
findwords
(vector
char
>>
& board, vector
& words)
};
結果:
單詞搜尋 II
給出乙個由小寫字母組成的矩陣和乙個字典。找出所有同時在字典和矩陣中出現的單詞。乙個單詞可以從矩陣中的任意位置開始,可以向左 右 上 下四個相鄰方向移動。樣例給出矩陣 doaf agai dcan和字典 返回 dog doafa gaidcandad d oafa gaid cancan doaf a...
單詞搜尋 II
給定乙個二維網格board和乙個字典中的單詞列表words,找出所有同時在二維網格和字典 現的單詞。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母在乙個單詞中不允許被重複使用。示例 輸入 words oath pea ea...
每日leetcode 單詞搜尋 單詞搜尋II
給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。示例 board a b c e s f c s a d e e 給定 word abcced 返回 ...