【LeetCode】820. 单词的压缩编码 Short Encoding of Words(Python)
作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/
题目地址:https://leetcode-cn.com/problems/short-encoding-of-words/
题目描述
单词数组 words 的 有效编码 由任意助记字符串 s 和下标数组 indices 组成,且满足:
words.length == indices.length- 助记字符串
s以'#'字符结尾 - 对于每个下标
indices[i],s的一个从indices[i]开始、到下一个'#'字符结束(但不包括'#')的 子字符串 恰好与words[i]相等
给你一个单词数组 words ,返回成功对 words 进行编码的最小助记字符串 s 的长度 。
示例 1:
输入:words = ["time", "me", "bell"]
输出:10
解释:一组有效编码为 s = "time#bell#" 和 indices = [0, 2, 5] 。
words[0] = "time" ,s 开始于 indices[0] = 0 到下一个 '#' 结束的子字符串,如加粗部分所示 "time#bell#"
words[1] = "me" ,s 开始于 indices[1] = 2 到下一个 '#' 结束的子字符串,如加粗部分所示 "time#bell#"
words[2] = "bell" ,s 开始于 indices[2] = 5 到下一个 '#' 结束的子字符串,如加粗部分所示 "time#bell#"
示例 2:
输入:words = ["t"]
输出:2
解释:一组有效编码为 s = "t#" 和 indices = [0] 。
提示:
1 <= words.length <= 20001 <= words[i].length <= 7words[i]仅由小写字母组成
题目大意
给了一个列表,里面保存的是各个单词,现在要看其中的某些单词能不能包括在其他单词里,这样就可以通过指出索引位置的方式压缩字符串的长度。
用#表示字符串的结尾。
要求最短的字符串的长度。
解题方法
倒序+排序
题目让我们使用索引字符串和索引列表能确定所有的单词,索引列表只给出了单词开始的index,而单词结束的位置通过#指出。
所以,如果某个单词s能被单词t包含,那么它必须是t的后缀!如果是后缀,则s可以被压缩。举例:me是time的后缀,因此这两个可以用time#索引字符串的[0,2]索引列表进行压缩。
如果所有单词两两的进行判断是不是后缀,那么总的时间复杂度是O(N^2),有没有更简单的方法呢?
一个降低时间复杂度的技巧是:如果需要判断的单词都是相邻的就好了!这种情况下,我们只需要遍历一遍就行。那怎么让相同后缀的单词相邻?排序呀!遇事不决先排序!
为了能够通过排序让结尾相同的单词邻近,可以考虑先把单词翻转。(也可以自定义排序函数,按照单词的逆序进行排序)
所以解题方法:
- 把所有单词进行翻转,并且按照字符序排序,这样相同结尾的单词就会天然弄到了一起。
- 然后,通过一次遍历,判断前面的单词是不是后面的单词的前缀(已经翻转了),如果不能的话说明前面的单词需要独立成一个新的以
#的,所以结果的长度要加上l
e
n
(
l
a
s
t
)
+
1
len(last) + 1
len(last)+1.
举个例子,对于输入:
words = ["time", "me", "bell"]
为了看一个单词能否包含另一个单词,先倒序,在排序,得到:
words = ["em", "emit", "lleb"]
为了能让最后一个单词也进行判断,可以在words末尾添加一个空字符串""。
words = ["em", "emit", "lleb", ""]
从左向右遍历,判断前一个单词是不是后一个单词的前缀,如果是的话就忽略这个单词;否则就拼接上前面这个单词。
得到最终结果emit#lleb#,长度是10。
Python代码如下:
class Solution:
def minimumLengthEncoding(self, words):
"""
:type words: List[str]
:rtype: int
"""
words = sorted([word[::-1] for word in set(words)])
last = ""
ans = 0
for word in words + [""]:
if not word.startswith(last):
ans += len(last) + 1
last = word
return ans
参考:书影博客
日期
2018 年 7 月 21 日 ———— 买了一个知识星球,要坚持看下去啊~
【LeetCode】820. 单词的压缩编码 Short Encoding of Words(Python)的更多相关文章
- Java实现 LeetCode 820 单词的压缩编码(暴力)
820. 单词的压缩编码 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", & ...
- Java实现 LeetCode 820 单词的压缩编码(字典树)
820. 单词的压缩编码 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", & ...
- [Swift]LeetCode820. 单词的压缩编码 | Short Encoding of Words
Given a list of words, we may encode it by writing a reference string S and a list of indexes A. For ...
- leetcode之820. 单词的压缩编码 | python极简实现字典树
题目 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell& ...
- python set() leetcode 签到820. 单词的压缩编码
题目 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell& ...
- LC 820. Short Encoding of Words
Given a list of words, we may encode it by writing a reference string S and a list of indexes A. For ...
- 【LeetCode】299. Bulls and Cows 解题报告(Python)
[LeetCode]299. Bulls and Cows 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题 ...
- 【LeetCode】743. Network Delay Time 解题报告(Python)
[LeetCode]743. Network Delay Time 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: ht ...
- 【LeetCode】518. Coin Change 2 解题报告(Python)
[LeetCode]518. Coin Change 2 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目 ...
随机推荐
- nginx二级域名指向不同文件项目配置
需要使用泛域名解析, 并且加上空的判断,以保证没有二级域名的也可以访问 核心配置 server_name ~^(?<subdomain>.+)\.caipudq\.cn$;if ( $su ...
- javaSE基础知识(走向编程的门口)— 更新完毕
前言:玩儿编程最重要的一点:不要怕麻烦,感觉是在浪费时间: 能动手绝不哔哔:只要脑袋不傻,编程都是"一看就会,一练就废",开始学的时候,就算再基础的东西都建议手敲一遍 要有囫囵吞枣 ...
- 数据集成工具—FlinkX
@ 目录 FlinkX的安装与简单使用 FlinkX的安装 FlinkX的简单使用 读取mysql中student表中数据 FlinkX本地运行 MySQLToHDFS MySQLToHive MyS ...
- 学习java 7.8
学习内容: 被static修饰的不需要创建对象,直接用类名引用即可 内部类访问特点:内部类可以直接访问外部类的成员,包括私有 外部类访问内部类的成员,必须创建对象 成员内部类,内部类为私有,Outer ...
- 我好像发现了一个Go的Bug?
从一次重构说起 这事儿还得从一次重构优化说起. 最近在重构一个路由功能,由于路由比较复杂,需求变化也多,于是想通过责任链模式来重构,刚好这段时间也在 Sentinel-Go 中看到相关源码. 用责任链 ...
- python web工程师跳巢攻略
python web工程师跳巢攻略 流程 一面问基础 二面问项目 三面问设计(经验) web请求的流程 浏览器 负载均衡 web框架 业务逻辑 数据库缓存 后端技术栈 python语言基础 语言特点 ...
- C/C++ Qt 数据库与SqlTableModel组件应用
SqlTableModel 组件可以将数据库中的特定字段动态显示在TableView表格组件中,通常设置QSqlTableModel类的变量作为数据模型后就可以显示数据表内容,界面组件中则通过QDat ...
- Default Assignment Operator and References
We have discussed assignment operator overloading for dynamically allocated resources here . This is ...
- 【Linux】【Services】【Disks】bftfs
1. 简介 1.1 Btrfs(B-tree,Butter FS,Better FS) 1.2. 遵循GPL,由oracle在2007年研发,支持CoW 1.3. 主要为了替代早期的ext3/ext4 ...
- 【Java 8】Predicate详解
一.java.util.function.Predicate 这里类是java自带主要广泛用在支持lambda表达式的API中. 1.接口源码 @FunctionalInterface public ...