生活随笔
收集整理的這篇文章主要介紹了
LeetCode 212. 单词搜索 II(Trie树+DFS)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目
給定一個二維網格 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 組成。
類似題目:LeetCode 79. 單詞搜索(回溯DFS)
2. Trie樹+DFS
- 先將單詞插入Trie樹
- 再遍歷board中的每個字符,以每個字符為起點DFS在Trie中查找
class TrieNode
{
public:string str
;TrieNode
*next
[26];bool isEnd
;TrieNode():isEnd(false) {memset(next
, 0, sizeof(TrieNode
*)*26);}
};
class Trie
{
public:TrieNode
*root
;Trie(){root
= new TrieNode();}~Trie(){destroy(root
);}void destroy(TrieNode
*root
){if(root
== NULL)return;for(int i
= 0; i
< 26; i
++)destroy(root
->next
[i
]);delete root
;}void insert(string word
){TrieNode
*cur
= root
;for(char s
:word
){if(cur
->next
[s
-'a'] == NULL)cur
->next
[s
-'a'] = new TrieNode();cur
= cur
->next
[s
-'a'];}cur
->isEnd
= true;cur
->str
= word
;}
};class Solution {Trie tree
;
public:vector
<string
> findWords(vector
<vector
<char>>& board
, vector
<string
>& words
) {for(auto word
: words
)tree
.insert(word
);int i
, j
;vector
<string
> ans
;for(i
= 0; i
< board
.size(); ++i
)for(j
= 0; j
< board
[0].size(); ++j
)dfs(board
,tree
.root
,i
,j
,ans
);return ans
;}void dfs(vector
<vector
<char>>& b
, TrieNode
*cur
, int x
, int y
, vector
<string
> &ans
){if(cur
->isEnd
){cur
->isEnd
= false;ans
.push_back(cur
->str
);return;}if(x
< 0 || x
== b
.size() || y
< 0 || y
== b
[0].size()) return;if(b
[x
][y
] == '#' || !cur
|| (b
[x
][y
] != '#' && cur
->next
[b
[x
][y
]-'a'] == NULL))return;char ch
= b
[x
][y
];cur
= cur
->next
[ch
-'a'];b
[x
][y
] = '#'; dfs(b
,cur
,x
+1,y
,ans
);dfs(b
,cur
,x
-1,y
,ans
);dfs(b
,cur
,x
,y
+1,ans
);dfs(b
,cur
,x
,y
-1,ans
);b
[x
][y
] = ch
; }
};
總結
以上是生活随笔為你收集整理的LeetCode 212. 单词搜索 II(Trie树+DFS)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。