Leetcode211. 添加与搜索单词 - 数据结构设计
思路:字典树
在字典树的基础上增加一个深度优先遍历,如果遍历到的字符串上字母,直接判断分治是否存在即可,如果是...则需要遍历当前结点的每一个分治
时间复杂度:addword时间复杂度是O(L)O(L)O(L),search时间复杂度是O(26L)O(26^L)O(26L)
空间复杂度:nnn是单词的个数,LLL是单词的最大长度,复杂度为O∗(N∗L)O*(N*L)O∗(N∗L)
class WordDictionary {
public:
struct Node
{
bool is_end;
Node *son[26];
Node()
{
is_end = false;
for (int i = 0; i < 26; i ++ ) son[i] = NULL;
}
}*root;
WordDictionary() {
root = new Node();
}
void addWord(string word) {
auto p = root;
for (auto c : word) {
int u = c - 'a';
if (!p->son[u]) p->son[u] = new Node();
p = p->son[u];
}
p->is_end = true;
}
bool search(string word) {
return dfs(root, word, 0);
}
bool dfs(Node* p, string& word, int i) {
if (i == word.size()) return p->is_end;
if (word[i] != '.') {
int u = word[i] - 'a';
if (p->son[u]) return dfs(p->son[u], word, i + 1);
else return false;
}
else {
for (int j = 0; j < 26; j ++ )
if (p->son[j] && dfs(p->son[j], word, i + 1))
return true;
return false;
}
}
};
/**
* Your WordDictionary object will be instantiated and called as such:
* WordDictionary* obj = new WordDictionary();
* obj->addWord(word);
* bool param_2 = obj->search(word);
*/
这篇博客介绍了如何使用字典树数据结构设计一个WordDictionary类,实现添加单词和搜索路径的功能。文章详细阐述了算法思路,包括在添加单词时的O(L)时间复杂度和搜索时的O(26L)时间复杂度。通过深度优先搜索策略,实现了对带通配符的单词搜索。
200

被折叠的 条评论
为什么被折叠?



