思路:
先將單詞插入到字首樹中,然後再dfs一步步去判斷下乙個要遍歷的字元是否存在字首樹中,若存在,則加入中間變數中,若當前遍歷的字串行在字典樹中組成乙個單詞,則加入ans中
不存在,則停止該方向的搜尋,因為字首不存在,則後面dfs生成的單詞均以此為字首,均不存在
在dfs時使用乙個set來儲存存在於字首樹中的單詞,因為遍歷時可能會有重複的單詞加入,注意dfs時對於vis陣列和中間變數的重置。
最後將自動排序好的set轉為vector作為ans返回即可。
class
trie
void
insert
(const string& word)
t->is_end =
true;}
};class
solution
, dy[4]
=;set aws;
// 暫存遍歷時的存在的單詞,可能會有重複元素,去重用set
string temp;
// 用來儲存遍歷時生成的中間字串
vectorbool
>> vis;
// 標記是否訪問過
public
:solution()
void
dfs(
int i,
int j,
const vectorchar
>>
& board,
const trie *t)
vis[i]
[j]=
true;if
(t->next[c -
'a']
->is_end ==
true
) aws.
insert
(temp)
;// 組成字首樹中的乙個單詞
for(
int k =
0; k <4;
++k)
// 執行到這裡重置vis和temp
vis[i]
[j]=
false
; temp.
pop_back()
;}vector
findwords
(vectorchar
>>
& board, vector
& words)
for(
int i =
0; i < row;
++i)
// 對整個圖dfs
for(
int j =
0; j < col;
++j)
dfs(i, j, board, root)
; vector
ans(aws.
begin()
, aws.
end())
;// set轉換為vector
return ans;}}
;
212 單詞搜尋 II
給定乙個二維網格 board 和乙個字典中的單詞列表 words,找出所有同時在二維網格和字典 現的單詞。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母在乙個單詞中不允許被重複使用。示例 輸入 words oath pea...
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...