LeetCode C 單詞搜尋 II

2021-10-07 09:04:59 字數 2918 閱讀 2242

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