leetcode刷题总结之前缀树

前言:
由于这段时间在学校上课了,刷题也只有每天晚上刷两道题了,不能像暑假那样刷题一肝到底了。前缀树是上个星期开始刷的,leetcode总共有17个前缀树的题目(其中包括3个收费题,所以我把14个免费题做完了),今天总结下,以后复习用。

前缀树的定义:
前缀树又名字典树,单词查找树,Trie树,是一种多路树形结构,是哈希树的变种,和hash效率有一拼,是一种用于快速检索的多叉树结构。前缀树具体定义:看这里

前缀树的模板:

class Trie
{
private:
 bool is_string = false;
 Trie* next[26] = { nullptr };//每个节点有26个链接
public:
 Trie() {}
 
 void insert(const string& word)//插入单词
 {
  Trie* root = this;
  for (const auto& w : word) {
   if (root->next[w - 'a'] == nullptr)root->next[w - 'a'] = new Trie();
   root = root->next[w - 'a'];
  }
  root->is_string = true;
 }
 
 bool search(const string& word)//查找单词
 {
  Trie* root = this;
  for (const auto& w : word) {
   if (root->next[w - 'a'] == nullptr)return false;
   root = root->next[w - 'a'];
  }
  return root->is_string;
 }
 
 bool startsWith(string prefix)//查找前缀
 {
  Trie* root = this;
  for (const auto& p : prefix) {
   if (root->next[p - 'a'] == nullptr)return false;
   root = root->next[p - 'a'];
  }
  return true;
 }
};

习题解析:


208. 实现 Trie (前缀树):本题直接套用前缀树的模板就好了。


211. 添加与搜索单词 - 数据结构设计:本题的解法为前缀树+dfs,遇到字符点.,然后利用dfs遍历next的26个链接中的有效节点,看能不能找到有效字符串就好了。


212. 单词搜索 II:本题的解法为前缀树+dfs,每个坐标点的四周进行dfs,将存在于字典树的坐标字符记录为’#’,等找到满足题目意思的单词后,回溯就好了。


336. 回文对:本题使用hashmap代替手动实现前缀树,建立hashmap用来存放<单词,下标>,建立set表用来存放单词单词(方便马拉车算法用的),换言之,本题使用的前缀树+马拉车算法。


421. 数组中两个数的最大异或值:本题将每个数字转换为二进制数存入前缀树中,然后利用异或的最大值temp为max|2^i,便可解题。


472. 连接词:本题在前缀树的基础上,稍微变化一点细节问题。


648. 单词替换:本题与其使用前缀树,我们倒不如直接比较数组中元素第一个字符和单词的第一个字符效率来的快。


676. 实现一个魔法字典:本题使用前缀树+dfs解题,不过只有一次机会去替换没有的字符,具体可看题解。


677. 键值映射:本题使用前缀树解法稍复杂,每个节点除了要存放单词中的字符外,还要存储累计value的总和,尾节点要存放该字符串的value值。使用map思路就很清晰了,用map来代替前缀树节点,利用map的自排序功能,遍历map来查找前缀,累加和为reuslt。


692. 前K个高频单词:本题使用map代替前缀树,若手动实现前缀树感觉费力不讨好,最后还是要将<string, int>装到vector进行排序,所以直接用map就好啦。排序后的<string, int>是按单词的频率(相同频率,按单词单词的弱序排列)排列,所有我们直接将前k个高频单词push到result中就好了。


720. 词典中最长的单词:本题将前缀树模板稍微改进以下就好了,最长的单词在字典树中的每个节点都能表示一个字符串,然后返回最长的就好了。


745. 前缀和后缀搜索:本题建立两个字典树就好了,建立前缀树和后缀树(后缀树就是将前缀树反着过来,也就是将每个单词反向后建立的前缀树就是后缀树了),前缀树用来查前缀,后缀树用来查后缀,并且节点记录访达权值,查找的时候排除边缘条件后对比权值就行。


1023. 驼峰式匹配:本题不知道和前缀树有啥关系,有大写字符换能建立前缀树?所以本题我们使用暴力解题,指针i、j分别用来遍历查询项和模式串,匹配就添加true,不匹配就返回false。


1032. 字符流:本题使用前缀树导致内存爆了,遂将字符串反向之后建立后缀树,然后在查询的时候将每个字符头插到一个用来存放所有查询字符的字符串,判断该字符串的前缀是否在后缀树就行了。


  • 22
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值