LC字典树
前缀树
你别教我打游戏
直面困难,重视过程,追求结果,淡忘过去。
展开
-
LeetCode 440. 字典序的第K小数字
字典树原创 2022-10-18 16:35:14 · 312 阅读 · 0 评论 -
LeetCode 1707. 与数组中元素的最大异或值 (字典树、位运算)
1707. 与数组中元素的最大异或值class Trie { struct Node { Node* childs[2] = {0}; int mmin = 1e9; }; Node* root = new Node;public: void insert(int x) { Node* p = root; p->mmin = min(x,p->mmin); for(int i =原创 2021-06-01 00:33:26 · 166 阅读 · 0 评论 -
LeetCode 676. 实现一个魔法字典(Trie+暴力 || DFS)
实现一个魔法字典前缀树存储单词。然后对要查询的每个单词,对它的每个位置去替代一个不同的字符,然后去字典树里面查询存在与否即可。class MagicDictionary { struct Node{ bool isEnd=false; Node* children[26] = {0}; }; Node* root = nullptr; void insert(const string& s){ Node*原创 2020-06-25 09:54:37 · 115 阅读 · 0 评论 -
LeetCode 1032. 字符流 (建树的思路——“后缀”树、后缀查询)
字符流此题主要是建立字典树的思路有点难。由于每次都要用到字符流的末尾,所以实际上是给定一个长字符串,判断字典树里是否有单词是它的后缀。比如 字典树{"bc","cd"},字符串"abc"的后缀bc字典里出现。如果是朴素想法的话,那应该每次去切割长的字符串,然后去字典树里查询,这样时间复杂度高达O(len(s1)∗len(s2))O(len(s1)*len(s2))O(len(s1)∗len(s2))。但是如果倒过来考虑,就很简单了。字典树里的单词一开始就反向插入,带查询的字符串也是反向查询,刚好原创 2020-06-28 20:02:36 · 3370 阅读 · 0 评论 -
LeetCode 212. 单词搜索 II (DFS+字典树)
单词搜索 II 它的简单版的功能是解决一个单词存在与否,如果此题直接套用这个函数,也是可行的,不过时间复杂度太高,O(m∗n∗len(str)∗size)O(m*n*len(str)*size)O(m∗n∗len(str)∗size)具体的来看,在一开始的搜索框架中,每次都是匹配一个字符串的某一个位置的字符。如何优化呢?用字典树去预存size个字符串,然后对于网格中的某一个节点去看字典树的这一层有没有这个字符,如果有,再去看它是不是某个字符串结尾(注意,如果是,不要回溯,继续往下搜)。这样,网格中的原创 2020-06-25 15:33:22 · 146 阅读 · 0 评论 -
LeetCode 面试题 17.17. 多次搜索 (两种做法建立前缀树)
多次搜索思路1:将每个小字符串插入Trie然后对大字符串的每个位置向后切割出字符串去匹配,用它去作前缀。在搜索过程中,如果节点不存在,直接结束函数;对于每个节点,如果它是某个小字符串的结尾,插入答案。时间复杂度:其中len1是平均小字符串的长度,len2是大字符串的长度。O(n∗len1+len2∗len2)O(n*len1+len2*len2)O(n∗len1+len2∗len2)class Solution { struct Node{ int id = -1;原创 2020-06-22 07:28:56 · 271 阅读 · 0 评论 -
LeetCode 648. 单词替换 (字典树、字符串分割)
单词替换思路:将词根单词插入字符串、然后检索每个单词即可。用vector<char>记录下路径上的字符,再用string(首迭代器,尾迭代器)即可。手打分割字符串class Solution { struct Node{ bool isEnd=false; Node* children[26] = {0}; }; Node *root = new Node; void insert(const string &s)原创 2020-06-21 16:53:25 · 222 阅读 · 0 评论 -
LeetCode 677. 键值映射 (暴力法、前缀树)
键值映射插入时间复杂度: O(K)O(K)O(K)查找时间复杂度: O(K)O(K)O(K)思路:每个节点保存和,之后可以直接查询。另外尾结点值存储键所对应的值。 struct Node{ long long val = LLONG_MAX; int sum = 0; Node* children[260] = {0}; };插入时,如果键不存在,插入这条链,路径上经过的节点值累加。如果已经存在,将路径上的点更新一个增量,另原创 2020-06-19 01:11:07 · 93 阅读 · 0 评论 -
LeetCode 421. 数组中两个数的最大异或值 (01Trie的入门题)
数组中两个数的最大异或值class Solution {public: vector<vector<int>> trie; int ans = 0,tot = 1; int findMaximumXOR(vector<int>& nums) { trie.resize(nums.size()*32,vector<int>(2,0)); for(int x:nums){原创 2020-06-18 19:44:50 · 117 阅读 · 0 评论 -
LeetCode 14. 最长公共前缀(字典序、前缀树、暴力)
字典序、快排一种很巧妙的做法,虽然时间复杂度有点高。通过排序,只要比较一前一后两个字符串即可,这个两个字符串有的前缀,那么中间的所有字符串也都有这样的前缀。class Solution {public: string longestCommonPrefix(vector<string>& strs) { if(strs.size()==0){ return ""; } if(strs.size().原创 2020-06-15 12:55:03 · 252 阅读 · 0 评论 -
LeetCode 211. 添加与搜索单词 - 数据结构设计 (字典树实现,回溯查询)
添加与搜索单词用字典树实现就不说了,主要说一下如何查询..ab..这样的模糊的字符串。简单的方法就是回溯,因为.匹配所有字符,所以对所有字符一一搜索,失败就回溯,正确就返回。这题用字典树可能不是最恰当的,以后再说吧class WordDictionary {private: struct Node{ bool isEnd = false; Node* childs[26] = {0}; }; Node *root; public:原创 2020-06-14 20:36:49 · 135 阅读 · 0 评论