文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 反转字符串+字符查找
    • 2.2 后缀树

1. 题目

给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。

例如,如果这个列表是 ["time", "me", "bell"],我们就可以将其表示为 S = "time#bell#"indexes = [0, 2, 5]

对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 "#" 结束,来恢复我们之前的单词列表。

那么成功对给定单词列表进行编码的最小字符串长度是多少呢?

示例:
输入: words = ["time", "me", "bell"]
输出: 10
说明: S = "time#bell#" , indexes = [0, 2, 5] 。提示:
1 <= words.length <= 2000
1 <= words[i].length <= 7
每个单词都是小写字母 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/short-encoding-of-words
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 反转字符串+字符查找

  • 将每个字符串反转,并按长度降序排序
  • 后面出现的单词在前面累积的字符串中查找到了,且为“后缀”(反转后的前缀),则不用加入答案字符串中,否则添加 #和字符串
class Solution {public:int minimumLengthEncoding(vector<string>& words) {for(string& w : words)reverse(w);//反转每个字符串sort(words.begin(), words.end(),[&](string& a, string& b){return a.size() > b.size();//长的在前});string ans;for(string& w : words){size_t pos = ans.find(w);//在ans里查找,没找到,或者,找到了,但是不是反转后的前缀if(pos == string::npos || ans[pos-1]!='#')// 注意["me" ,"mean"]之类的例子ans += "#"+w;}return ans.size();}void reverse(string& s){int i = 0, j = s.size()-1;while(i < j)swap(s[i++],s[j--]);}
};

2.2 后缀树

  • 将字符串逆序插入前缀树(Trie)
  • 采用哈希表存储子节点,实现如下
class Trie
{public:unordered_map<char,Trie*> m;// bool isEnd = false;void rev_insert(string& s){Trie* root = this;for(int i = s.size()-1; i >= 0; --i){if(!(root->m).count(s[i])){Trie* node = new Trie();root->m.insert(make_pair(s[i],node));}root = root->m[s[i]];}// root->isEnd = true;}
};
class Solution {int len = 0;
public:int minimumLengthEncoding(vector<string>& words) {Trie *t = new Trie();for(string& w : words)t->rev_insert(w);dfs(t,0);return len;}void dfs(Trie * root, int count){if(root->m.size()==0)// 是叶子节点{len += count+1;// +1是 ‘#’return;}for(auto it = root->m.begin(); it != root->m.end(); ++it)dfs(it->second, count+1);}
};

LeetCode 820. 单词的压缩编码(后缀树)相关推荐

  1. 820. 单词的压缩编码

    820. 单词的压缩编码 思路:reverse后排序,只需要比较相邻的字符串 class Solution { public:int minimumLengthEncoding(vector<s ...

  2. LeetCode 425. 单词方块(Trie树+DFS)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个单词集合 (没有重复),找出其中所有的 单词方块 . 一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < ...

  3. 字典树实现_leetcode之820. 单词的压缩编码 | python极简实现字典树

    题目 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell& ...

  4. LeetCode 527. 单词缩写(Trie树)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个由n个不重复非空字符串组成的数组,你需要按照以下规则为每个单词生成最小的缩写. 初始缩写由起始字母+省略字母的数量+结尾字母组成. 若存在冲突,亦 ...

  5. LeetCode 648. 单词替换(Trie树)

    1. 题目 在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词--我们称这个词为 继承词(successor).例如,词根an,跟随着单词 other(其他), ...

  6. leetcode 212. 单词搜索 II 字典树+深度优先搜索 java代码 详细解释

    给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格 ...

  7. 程序员面试金典 - 面试题 17.25. 单词矩阵(Trie树+DFS回溯,hard)

    1. 题目 给定一份单词的清单,设计一个算法,创建由字母组成的面积最大的矩形,其中每一行组成一个单词(自左向右),每一列也组成一个单词(自上而下). 不要求这些单词在清单里连续出现,但要求所有行等长, ...

  8. LeetCode 212. 单词搜索 II(Trie树+DFS)

    1. 题目 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻&qu ...

  9. NOI数据结构:后缀树

    NOI数据结构:后缀树 后缀树_fanzitao的专栏-CSDN博客_后缀树 后缀树 - sangmado - 博客园 字符串-后缀树和后缀数组详解 字符串-后缀树和后缀数组详解_吴泽龙的博客-CSD ...

最新文章

  1. 从零到一编码实现Redis分布式锁
  2. log4net环境配置
  3. 动画,视频处理的计算机系统,音视频与动画处理.ppt
  4. Navicat Premium 11 12 闪退
  5. 谁记录了mysql error log中的超长信息
  6. 第 197 章 Unity
  7. Python机器学习:逻辑回归007scikit-learn中的逻辑回归
  8. 修改IDEA格式化单行注释 后增加空格
  9. 导航一体机端口测试软件,导航端口查看器
  10. 单片机初始化WIFI模块
  11. UIWebView加载本地HTML文件
  12. 修改gitlab 去掉双重认证 Two-Factor Authentication
  13. 服务器没有信号给到继电器,dx-8型信号继电器为什么有自锁结构
  14. sqlserver2000数据库迁移到2008R2
  15. 必须学会的几道家常菜
  16. linux文件重定向 dup,linux之dup和dup2函数解析
  17. 解决The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value
  18. Kubernetes--k8s---进阶--管理工具helm--helm全面介绍
  19. MX3从flyme5降级至flyme3
  20. 推荐几款项目管理工具 总有一款适合你

热门文章

  1. python xyz_python中xyz坐标的欧几里德距离
  2. iOS各种小理论知识
  3. Linux高性能服务器编程:进程池和线程池原理及应用(有图有代码有真相!!!)
  4. 第二季1:图像基础知识
  5. linux报网络设备繁忙,【分享】linux常用命令
  6. openstack添加热添加硬盘并识别
  7. 60、二叉搜索树的第k个结点
  8. Bootstrap实现弹出框和提示框效果代码
  9. Java设计模式-外观模式(Facade)
  10. 2015/4/14课堂练习