211. Design Add and Search Words Data Structure - Medium
前往題目
想法
- 可搜尋字詞功能我第一個想法是建構一顆樹(
Trie
),字母連著字母 - 這題是資料結構,比較好玩一點😆
思路
Trie
的資料結構,用array
儲存字母,因為固定最多26
個- 加入就直接判斷有沒有該字母,沒有的話
init.
有的話直接略過,看下一個 Search
用Backtracking
的方式加入帶有.
的詞
比較妙的是backtracking
的部分,參照以下的code
可以看到,遇到.
的時候就會疊代當前trie node
的每一個child
,在每個child
裡都再call
一次searchHelper
以檢查接下來的字母,這裡蠻tricky
的,比較難想出來
Code
search
的部分沒有想出來,參考了Neetcode大大的影片
class WordDictionary {
private class Trie {
char c;
Trie[] children;
boolean isWord;
public Trie(char c) {
children = new Trie[26];
isWord = false;
this.c = c;
}
}
Trie root;
public WordDictionary() {
root = new Trie('\0'); // Init.
}
public void addWord(String word) {
// Maintain root
Trie curr = root;
for (int i = 0; i < word.length(); ++i) {
char c = word.charAt(i);
// Check if already init.
if (curr.children[c - 'a'] == null) {
// Init. and add
curr.children[c - 'a'] = new Trie(c);
}
// switch the current trie
curr = curr.children[c - 'a'];
}
// Mark the end of the word
curr.isWord = true;
}
public boolean search(String word) {
return searchHelper(word, root, 0);
}
private boolean searchHelper(String word, Trie curr, int index) {
for (int i = index; i < word.length(); ++i) {
char c = word.charAt(i);
if (c == '.') {
for (Trie t : curr.children) {
// Search the next char
if (t != null && searchHelper(word, t, i + 1)) {
return true;
}
}
return false;
}
// Word does not exist
if (curr.children[c - 'a'] == null) {
return false;
}
// Next char
curr = curr.children[c - 'a'];
}
return curr.isWord;
}
}
2024/04/22
search
的時候有點掙扎,複習了才寫出來
211. Design Add and Search Words Data Structure - Medium
https://f88083.github.io/2023/12/02/211-Design-Add-and-Search-Words-Data-Structure-Medium/