问题描述:给定一个单词列表,我们将这个列表编码成一个索引字符串 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. Trie树

利用字典构造Trie树。力扣题实现Trie(前缀树)

class Trie:def __init__(self):# 初始化self.data = {}def insert(self, word):# 插入字符串wordcur = self.datafor letter in word:cur.setdefault(letter, {})cur = cur[letter]cur.setdefault('#', {})def search(self, word):# 在Trie树中搜索wordcur = self.datafor letter in word:if letter not in cur:return Falseelse:cur = cur[letter]return '#' in cur def startwith(self, prefix):# 在Trie树中搜索前缀prefixcur = self.datafor letter in prefix:if letter not in cur:return Falseelse:cur = cur[letter]return True
# use the Trie like this
obj = Trie()
obj.insert('hello')
obj.search('hello') # return True
obj.search('hel') # return False
obj.startwith('hel') # return True

2. 解决问题

上面的Trie树是前缀树,问题里实际上是后缀问题,因此,我们需要将每一个字符串反转,然后再插入Trie树中。

    def minimumLengthEncoding(self, words: List[str]) -> int:# 将字符串列表重新排列,按照字符串长度,从大到小排序wordsList = sorted(words, key=lambda x:len(x), reverse=True)# 创建Trie树obj = self.Trie()len_S = 0# 遍历字符串列表for word in wordsList:# 字符串反转word = word[::-1]# 如果Trie树中有word字符串if obj.search(word):continue# 如果Trie树中有word前缀elif obj.startwith(word):continue# 如果Trie树中不包含word字符串else:obj.insert(word)len_S += len(word) + 1return len_S

单词压缩编码--Trie树相关推荐

  1. LeetCode 758. 字符串中的加粗单词(Trie树)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个关键词集合 words 和一个字符串 S,将所有 S 中出现的关键词加粗.所有在标签 <b> 和 </b> 中的字母都会加 ...

  2. LeetCode 720. 词典中最长的单词(Trie树)

    1. 题目 给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最小的单词. 若无 ...

  3. 720 词典中最长的单词(Trie树)

    1. 问题描述: 给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最小的单词. ...

  4. 【bzoj4567】[Scoi2016]背单词 贪心+trie树

    我个傻逼,这么水的题还调了那么久. 把所有的串都反过来,建trie树,很明显,不同子树间是不影响的. 一定是先选择父亲节点再选子节点,同一个节点先选子树大小最小的儿子即可. 一开始想错了,以为可以直接 ...

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

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

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

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

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

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

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

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

  9. 算法 | 动画+解析,轻松理解「Trie树」

    Trie这个名字取自"retrieval",检索,因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词. 虽然发音与「Tree」一致,但为了将这种 字典树 与 普通二叉树 ...

最新文章

  1. git rebase用法
  2. STL_vector
  3. 数据结构的一些命名英文全称
  4. IconFont的制作使用
  5. grad在python什么模块_深度学习(Deep Learning)基础概念1:神经网络基础介绍及一层神经网络的python实现...
  6. Linux下暴力破解工具Hydra详解
  7. 日志 中文乱码、nacos 中文乱码、saltstack 中文乱码、docker中文乱码
  8. LeetCode 463. Island Perimeter
  9. 如何保护 .NET 应用的安全?
  10. HttpClient4.x之Post请求示例
  11. Word2Vec 与 Word Embedding的关系
  12. 性能测试--jmeter中的函数助手【15】
  13. 【运筹学】产销平衡问题的表上作业法
  14. 【C语言】有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出,问最后留下的人是原来第几号。
  15. BT5 CDLinux+U盘启动 破解无线网络
  16. vue element-ui el-form表单验证表单验证,数值输入验证踩坑
  17. word 2010 尾注 尾注序号 连续尾注 尾注分隔符 删除
  18. Python 数据处理工具 Pandas(上)
  19. VOT2018——研究指南
  20. MP4/MP3解封装ffmpeg(十三)

热门文章

  1. python的类是什么_Python类(class)
  2. angular 控件css_Angular父组件内修改子组件的样式
  3. qcustomplot绘制热力图瀑布图_使用REmap绘制中国地图
  4. 夏侯南溪搭建目标检测模型——文件结构设计篇
  5. 个人所得税计算及多人避税问题
  6. Spring框架中级联赋值(外部属性注入)以及内部属性注入
  7. 【半年总结】愿有岁月可回首
  8. ActionScript读取XML的路径问题
  9. javascript中的||运算符
  10. django ----CBV中加装饰器