Leetcode211. 添加与搜索单词 - 数据结构设计
思路:字典树
在字典树的基础上增加一个深度优先遍历,如果遍历到的字符串上字母,直接判断分治是否存在即可,如果是 . . .则需要遍历当前结点的每一个分治
时间复杂度:addword
时间复杂度是
O
(
L
)
O(L)
O(L),search
时间复杂度是
O
(
2
6
L
)
O(26^L)
O(26L)
空间复杂度: n n n是单词的个数, L L L是单词的最大长度,复杂度为 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);
*/