0820. 单词的压缩编码
题目地址(820. 单词的压缩编码)
https://leetcode-cn.com/problems/short-encoding-of-words/
题目描述
前置知识
公司
阿里
字节
思路
读完题目之后就发现如果将列表中每一个单词分别倒序就是一个后缀树问题。比如 ["time", "me", "bell"]
倒序之后就是 ["emit", "em", "lleb"],我们要求的结果无非就是 "emit" 的长度 + "llem"的长度 + "##"的长度(em 和 emit 有公共前缀,计算一个就好了)。
因此符合直觉的想法是使用前缀树 + 倒序插入的形式来模拟后缀树。
下面的代码看起来复杂,但是很多题目我都是用这个模板,稍微调整下细节就能 AC。我这里总结了一套前缀树专题
前缀树的 api 主要有以下几个:
insert(word)
: 插入一个单词search(word)
:查找一个单词是否存在startWith(word)
: 查找是否存在以 word 为前缀的单词
其中 startWith 是前缀树最核心的用法,其名称前缀树就从这里而来。大家可以先拿 208 题开始,熟悉一下前缀树,然后再尝试别的题目。
一个前缀树大概是这个样子:
如图每一个节点存储一个字符,然后外加一个控制信息表示是否是单词结尾,实际使用过程可能会有细微差别,不过变化不大。
这道题需要考虑 edge case, 比如这个列表是 ["time", "time", "me", "bell"] 这种包含重复元素的情况,这里我使用 hashset 来去重。
关键点
前缀树
去重
代码
复杂度分析
时间复杂度:$O(N)$,其中 N 为单词长度列表中的总字符数,比如["time", "me"],就是 4 + 2 = 6。
空间复杂度:$O(N)$,其中 N 为单词长度列表中的总字符数,比如["time", "me"],就是 4 + 2 = 6。
大家也可以关注我的公众号《力扣加加》获取更多更新鲜的 LeetCode 题解
相关题目
最后更新于