???? 算法练习,由于博客并不适合书写太长篇幅,所以后期如果有需要在将自己学习的笔记整合成PDF的形式,实在是太卡了>……<。 那篇文章足足卡了十次,太惨烈了。

今天这是一道程序设计的题目

211. 添加与搜索单词 - 数据结构设计

题目链接:211. 添加与搜索单词 - 数据结构设计](https://leetcode-cn.com/problems/design-add-and-search-words-data-structure/)

难在查找部分,需要借助前缀树来完成。。。 这部分之前没有做过相关练习。参考大佬的​​负雪明烛​​的题解完成了这道题。

emm 参考大佬的代码 写了一遍

题解:

  • 存储可以用容器完成 难点在于如何设计查询算法。
  • 本题讨论的[前缀树]就是每个节点的children有规律的多叉树。

应用

上面说了这么多前缀树,那前缀树有什么用呢?

其实我们生活中早有应用。

  1. 比如我们常见的电话拨号键盘,当我们输入一些数字的时候,后面会自动提示以我们的输入数字为开头的所有号码。
  2. 比如我们的英文输入法,当我们输入半个单词的时候,输入法上面会自动联想和补全后面可能的单词。
  3. 再比如在搜索框搜索的时候,输入"负雪",后面会联想到 负雪明烛 。

emm 参考大佬的代码 写了一遍

class TrieNode{
public:
vector<TrieNode*> child;
bool isWord;
TrieNode() : child(26, nullptr), isWord(false){};
~TrieNode(){
for(auto c : child) delete c;
}
};

class WordDictionary {
public:
// 初始化数据
WordDictionary() {
root = new TrieNode();
}
// 结束后调用析构函数,删除节点
~WordDictionary(){
delete root;
}

// 添加字母到数据结构中
void addWord(string word) {
TrieNode* p = root;
for(char c :word){
int i = c - 'a';
if(!p->child[i])
p->child[i] = new TrieNode();
p = p->child[i];
}
p->isWord = true;
}

bool search(string word) {
return match(word, root, 0);
}

bool match(string& word, TrieNode* p, int start){
if(!p) return false;
if(start == word.size()) return p->isWord;
char c =word[start];
if(c != '.'){
return match(word, p->child[c - 'a'],start + 1);
}else{
for(const auto& child : p->child){
if(match(word, child, start + 1))
return true;
}
}
return false;
}
private:
TrieNode* root;
};

/**
* Your WordDictionary object will be instantiated and called as such:
* WordDictionary* obj = new WordDictionary();
* obj->addWord(word);
* bool param_2 = obj->search(word);
*/