前言
欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
今天是五月集训第二十三天:字典树🔥🔥🔥🔥🔥🔥
一、练习题目
211. 添加与搜索单词 - 数据结构设计
1268. 搜索推荐系统
421. 数组中两个数的最大异或值
1707. 与数组中元素的最大异或值
二、未完待续
2022-05-23 13:34
字典树是一个完全不会的领域,花了时间看了关于字典树的先验知识,再来看题,做了第一题,不是自己写的,但是敲了一遍会发现对文章写的东西看起来好理解了一点,剩下的题目后续慢慢来了😢。越来越难。
三、算法思路
- 1、211. 添加与搜索单词 - 数据结构设计:学习字典树的插入和搜索操作,字典树的搜索操作是需要用深搜来完成的。
- 2、1268. 搜索推荐系统:
- 3、421. 数组中两个数的最大异或值:
- 4、1707. 与数组中元素的最大异或值:
四、源码剖析
// 211. 添加与搜索单词 - 数据结构设计
class WordDictionary {
public:
struct TrieNode {
int isEnd;
struct TrieNode*next[26];
TrieNode() {
isEnd = false;
memset(next, 0, sizeof(next));
}
}; //(1)
struct TrieTree {
TrieNode *root;
TrieTree() {
root = nullptr;
}
void insert(const string& s) {
if(root == nullptr) {
root = new TrieNode();
}
TrieNode *now = root;
for(int i = 0; i < s.size(); ++i) {
int idx = s[i] - 'a';
if(now->next[idx] == nullptr) {
now->next[idx] = new TrieNode();
}
now = now->next[idx];
}
now->isEnd = true;
} //(2)
bool dfs(TrieNode* now, const string& s, int idx) {
if(now == nullptr) {
return false;
}
if(idx == s.size()) {
return now->isEnd;
}
if(s[idx] == '.') {
for(int i = 0; i < 26; ++i) {
if(dfs(now->next[i], s, idx+1)) {
return true;
}
}
return false;
}else {
return dfs(now->next[s[idx] - 'a'], s, idx+1);
}
}
}; //(3)
TrieTree t;
WordDictionary() {
}
void addWord(string word) {
t.insert(word);
}
bool search(string word) {
return t.dfs(t.root, word, 0);
}
};
- 1、构建字典树的结点;
- 2、完成字典树中的插入操作;
- 3、完成字典树中的搜索操作,要考虑有’.'存在的问题。
// 1268. 搜索推荐系统
- 1、
// 421. 数组中两个数的最大异或值
- 1、
// 1707. 与数组中元素的最大异或值
- 1、