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);}
};

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql查询分页

用sql 查询时select top 10 * from Orders order by orderid desc操作时&#xff0c;我们先对查询结果进行ordersby排序 然后才取出其最前边10个使用sql查询分页时的几点思路&#xff08;举例均从查询第100到120之间20条记录&#xff09;1.取前120条记录orderby主键&#xff0c…

openstack实例状态错误_Openstack虚机操作总结

1. 概览Openstack作为常见的IAAS服务&#xff0c;其最核心的对象就是虚机实例&#xff0c;而Openstack下支持的虚机操作有很多种&#xff0c;有些是特别常见的虚机操作比如创建虚机、启动虚机、删除虚机等&#xff0c;而有些虚机操作则是针对特定场景下比如出现故障而提供的保护…

神网站PaperWithoutCode:举报无法复现的论文,让一作社死??

文 | 小戏几乎是可以肉眼可见的看到机器学习领域的论文几何级的增长&#xff0c;在铺天盖地的论文雪花纸片般涌来时&#xff0c;灌水、可复现性、工作真实的意义这些概念也伴随着 Paper 的洪水进入了人们的视野。谈及科研&#xff0c;我们总是站在以往研究的基础上&#xff0c;…

仿WINDWS无限级Ajax菜单树升级1.3版(修补了严重BUG)

仿WINDWS无限级Ajax菜单树升级1.3版(修补了严重BUG) WINDWS无限级Ajax菜单树又升级了(1.3版) 对以下BUG进行了修复 1.只能在文字上拖拽(不能从文件夹图标上拖) 2.拖拽后不刷新菜单的BUG&#xff08;拖拽为子级菜单后&#xff0c;菜单原地不消失的情况。也…

程序员面试金典 - 面试题 08.11. 硬币(背包DP)

文章目录1. 题目2. 解题1. 题目 硬币。给定数量不限的硬币&#xff0c;币值为25分、10分、5分和1分&#xff0c;编写代码计算 n 分有几种表示法。(结果可能会很大&#xff0c;你需要将结果模上1000000007) 示例1:输入: n 5输出&#xff1a;2解释: 有两种方式可以凑成总金额:…

ab的plc跟西门子哪个好些_2020滚筒洗衣机哪个牌子好?想买滚筒洗衣机的看过来!...

滚筒洗衣机哪个牌子好&#xff1f;想买滚筒洗衣机的人越来越多&#xff0c;滚筒洗衣机无疑是现在大多数年轻人更喜欢的款式&#xff0c;颜值高、功能多、追求个性化洗衣操作&#xff0c;滚筒的不伤衣物更温柔对于有真丝雪纺面料衣物的&#xff0c;滚筒洗衣机现在真是越来越智能…

AI开始参与政治选举了??

编 | David 好困源 | 新智元让AI去参加议会选举&#xff0c;能成吗&#xff1f;一个丹麦政党让AI聊天机器人当了领袖&#xff0c;试图在议会中拿下一席&#xff0c;现距离20000个提名的门槛线仅差19988个了。现在的AI能干的事情太多了&#xff0c;写作文、画画、下棋、玩游戏&a…

Linux NAT设定

1&#xff1a;echo "1" >/proc/sys/net/ipv4/ip_forward 或vi /proc/sys/net/ipv4/ip_forward把0改为1&#xff0c;0表示IP FORWARDING功能是关闭&#xff0c;1表示开启。2&#xff1a;iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0/24 -j MASQUERADE &a…

程序员面试金典 - 面试题 16.02. 单词频率(哈希表/Trie树)

文章目录1. 题目2. 解题2.1 哈希解法2.2 Trie树1. 题目 设计一个方法&#xff0c;找出任意指定单词在一本书中的出现频率。 你的实现应该支持如下操作&#xff1a; WordsFrequency(book)构造函数&#xff0c;参数为字符串数组构成的一本书get(word)查询指定单词在数中出现的…

加州大学博士生Wendy:谈论文精读与方法创新

最近刷朋友圈&#xff0c;很多童鞋的状态都是&#xff0c;不是在搞科研&#xff0c;就是在搞科研的路上&#xff0c;每日为了科研废寝忘食……每天的生活日常&#xff0c;除了下文献、读文献&#xff0c;就是做实验、写论文&#xff0c;debug&#xff0c;二十多岁的自己看着像三…

小米10pro第二个摄像头下面_小米10至尊纪念版、小米10 Pro对比评测:至尊版“至尊”在哪里?...

在几天前的雷军十周年演讲中&#xff0c;小米10至尊纪念版正式面世&#xff0c;价格刚公布&#xff0c;就引起了不小轰动。在吃瓜群众看来&#xff0c;小米终于迈向了高端&#xff0c;毕竟最贵的版本&#xff0c;售价可以卖到6999元&#xff0c;和三星、苹果旗舰保持在一个水准…

转:程序员每天该做的事

程序员每天该做的事 1、总结自己一天任务的完成情况 最好的方式是写工作日志&#xff0c;把自己今天完成了什么事情&#xff0c;遇见了什么问题都记录下来&#xff0c;日后翻看好处多多 >> 好记性不如烂笔头。呵呵 2、考虑自己明天应该做的主要工作 把明天要做的事情…

MiOJ 3. 大数相减(字符串减法)

1. 题目 描述 两个长度超出常规整形变量上限的大数相减&#xff0c;请避免使用各语言内置大数处理库&#xff0c;如 Java.math.BigInteger 等。 输入 有 N 行测试数据&#xff0c;每一行有两个代表整数的字符串 a 和 b&#xff0c;长度超过百位。规定 a>b&#xff0c;a, …

Saleforce发布跨模态框架LAVIS,涵盖数据、任务、模型

作者 | HJZ来源 | 机器之心Salesforce 亚洲研究院推出了一站式视觉语言开源框架 LAVIS。视觉语言模型在内容推荐、电子商务里有广泛应用&#xff0c;例如图像描述生成、文本图像检索以及多模态内容分类。依托于海量互联网数据&#xff0c;多模型模型近期得到长足发展&#xff0…

python 跳过_python-pytest学习(九)-跳过用例skip

一、前言 pytest.mark.skip可以标记无法在某些平台上运行的测试功能&#xff0c;或者你希望是吧的测试功能。 skip意味着只有满足某些条件时才希望测试通过&#xff0c;否则pytest应该跳过运行测试。常见示例是在非windows平台上跳过仅限windows的测试&#xff0c;或跳过测试依…

Alexa世界排名原理+作弊源码,为网站赢得好排名

虽然说 Alexa世界排名存在水分&#xff0c;高低都无所谓&#xff0c;只要能在搜索引擎中排名靠前就好了&#xff0c;但是一些风险投资还是把它当作网站的一个参考依据&#xff0c;就迫使一些网站不得不提升自己的Alexa世界排名&#xff0c;那如何让你的网站在Alexa世界排名靠前…

matlab和python哪个运行快_MATLAB比Python快吗?

你可以在这个链接的底部找到一些有用的结果 从介绍开始A comparison of weave with NumPy, Pyrex, Psyco, Fortran (77 and 90) and C for solving Laplaces equation. 它还比较了MATLAB&#xff0c;并显示了与使用Python和NumPy时类似的速度。 当然&#xff0c;这只是一个特定…

LeetCode 1162. 地图分析(BFS)

1. 题目 你现在手里有一份大小为 N x N 的『地图』&#xff08;网格&#xff09; grid&#xff0c;上面的每个『区域』&#xff08;单元格&#xff09;都用 0 和 1 标记好了。其中 0 代表海洋&#xff0c;1 代表陆地&#xff0c;你知道距离陆地区域最远的海洋区域是是哪一个吗…

邹建老大写的经典SQL

邹建老大写的经典SQL/Files/602544/SQLServer2000.rar 转载于:https://www.cnblogs.com/602544/archive/2006/12/10/588210.html

sentinel 端口_双剑合璧Nacos结合Sentinel实现流量安全控制(一):Sentinel核心库和控制台...

Alibaba Sentinel 是一款高性能且轻量级的流量控制、熔断降级解决方案。是面向分布式服务架构的高可用流量控制组件。Sentinel 官网&#xff1a;https://sentinelguard.io/zh-cn/Github&#xff1a;https://github.com/alibaba/Sentinel一、Sentinel 是什么随着微服务的流行&am…