LeetCode 820. 单词的压缩编码(后缀树)
文章目录
- 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. 单词的压缩编码(后缀树)相关推荐
- 820. 单词的压缩编码
820. 单词的压缩编码 思路:reverse后排序,只需要比较相邻的字符串 class Solution { public:int minimumLengthEncoding(vector<s ...
- LeetCode 425. 单词方块(Trie树+DFS)
文章目录 1. 题目 2. 解题 1. 题目 给定一个单词集合 (没有重复),找出其中所有的 单词方块 . 一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < ...
- 字典树实现_leetcode之820. 单词的压缩编码 | python极简实现字典树
题目 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell& ...
- LeetCode 527. 单词缩写(Trie树)
文章目录 1. 题目 2. 解题 1. 题目 给定一个由n个不重复非空字符串组成的数组,你需要按照以下规则为每个单词生成最小的缩写. 初始缩写由起始字母+省略字母的数量+结尾字母组成. 若存在冲突,亦 ...
- LeetCode 648. 单词替换(Trie树)
1. 题目 在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词--我们称这个词为 继承词(successor).例如,词根an,跟随着单词 other(其他), ...
- leetcode 212. 单词搜索 II 字典树+深度优先搜索 java代码 详细解释
给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格 ...
- 程序员面试金典 - 面试题 17.25. 单词矩阵(Trie树+DFS回溯,hard)
1. 题目 给定一份单词的清单,设计一个算法,创建由字母组成的面积最大的矩形,其中每一行组成一个单词(自左向右),每一列也组成一个单词(自上而下). 不要求这些单词在清单里连续出现,但要求所有行等长, ...
- LeetCode 212. 单词搜索 II(Trie树+DFS)
1. 题目 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻&qu ...
- NOI数据结构:后缀树
NOI数据结构:后缀树 后缀树_fanzitao的专栏-CSDN博客_后缀树 后缀树 - sangmado - 博客园 字符串-后缀树和后缀数组详解 字符串-后缀树和后缀数组详解_吴泽龙的博客-CSD ...
最新文章
- 从零到一编码实现Redis分布式锁
- log4net环境配置
- 动画,视频处理的计算机系统,音视频与动画处理.ppt
- Navicat Premium 11 12 闪退
- 谁记录了mysql error log中的超长信息
- 第 197 章 Unity
- Python机器学习:逻辑回归007scikit-learn中的逻辑回归
- 修改IDEA格式化单行注释 后增加空格
- 导航一体机端口测试软件,导航端口查看器
- 单片机初始化WIFI模块
- UIWebView加载本地HTML文件
- 修改gitlab 去掉双重认证 Two-Factor Authentication
- 服务器没有信号给到继电器,dx-8型信号继电器为什么有自锁结构
- sqlserver2000数据库迁移到2008R2
- 必须学会的几道家常菜
- linux文件重定向 dup,linux之dup和dup2函数解析
- 解决The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value
- Kubernetes--k8s---进阶--管理工具helm--helm全面介绍
- MX3从flyme5降级至flyme3
- 推荐几款项目管理工具 总有一款适合你