题目描述

样例描述

思路

方法一:存储后缀 + 哈希去重
如果一个单词不是任何其他单词的后缀,那么它就是最短的编码。反之,是的话可以删除。

  1. 首先全部加入Set集合去重,对于每个单词,结合数据范围,依次在set里面删除它们所有的后缀。剩余的就是可编码的单词。加上1(#字符)的长度就是答案
    方法二:排序 + 字典树
  2. 在方法一的基础上,可以把所有单词逆序挂在trie树上(方便查找后缀),在不断插入到树中,如果是新的单词,就需要编码为长度加一,否则直接用树上的不需要编码
  3. 注意要让长的单词先插入,如果短的先插入,并且是某长的后缀,将会被视为不同的。例如time,和me。 所以要先降序排序

代码

class Solution {public int minimumLengthEncoding(String[] words) {Set<String> set = new HashSet<>(Arrays.asList(words));//枚举删除每个单词的所有后缀for (String word: words) {//由数据范围比较小,直接枚举删除for (int k = 1; k < word.length(); k ++ ) {set.remove(word.substring(k, word.length()));}}//剩余的单词不是任何其他单词的后缀,  因此加上1 (#字符)求和就是答案int ans = 0;for (String s: set) {ans += s.length() + 1;}return ans;}
}

trie树

class Solution {class TrieNode {TrieNode tns[];boolean isWord;public TrieNode() {tns = new TrieNode[26];}}private TrieNode root;public int insert(String word) {TrieNode p = root;//是否是新的,原trie树中不存在boolean isNew = false;for (int i = word.length() - 1; i >= 0; i -- ) {int u = word.charAt(i) - 'a';if (p.tns[u] == null) {isNew = true;p.tns[u] = new TrieNode();}p = p.tns[u];}//是新的话,就返回长度加一(#的字符),否则不用编码return isNew ? word.length() + 1 : 0;}public int minimumLengthEncoding(String[] words) {root = new TrieNode();//降序排序Arrays.sort(words, (a, b) ->{return b.length() - a.length();});int ans = 0;for (String s: words) {ans += insert(s);}return ans;}
}

Leetcode--Java--820. 单词的压缩编码相关推荐

  1. 820. 单词的压缩编码

    820. 单词的压缩编码 思路:reverse后排序,只需要比较相邻的字符串 class Solution { public:int minimumLengthEncoding(vector<s ...

  2. LeetCode 820. 单词的压缩编码(后缀树)

    文章目录 1. 题目 2. 解题 2.1 反转字符串+字符查找 2.2 后缀树 1. 题目 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 [&q ...

  3. 字典树实现_leetcode之820. 单词的压缩编码 | python极简实现字典树

    题目 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", "bell& ...

  4. leetcode 字符串之单词

    leetcode 字符串之单词 leetcode820. 单词的压缩编码 1. 题目 2. 解答 leetcode139. 单词拆分 1. 题目 2. 解答 leetcode127. 单词接龙 1. ...

  5. LeetCode 244. 最短单词距离 II(哈希map+set二分查找)

    文章目录 1. 题目 2. 解题 2.1 暴力超时 2.2 哈希表+set二分查找 1. 题目 请设计一个类,使该类的构造函数能够接收一个单词列表. 然后再实现一个方法,该方法能够分别接收两个单词 w ...

  6. LeetCode 245. 最短单词距离 III

    文章目录 1. 题目 2. 解题 1. 题目 给定一个单词列表和两个单词 word1 和 word2,返回列表中这两个单词之间的最短距离. word1 和 word2 是有可能相同的,并且它们将分别表 ...

  7. LeetCode 243. 最短单词距离

    文章目录 1. 题目 2. 解题 1. 题目 给定一个单词列表和两个单词 word1 和 word2,返回列表中这两个单词之间的最短距离. 示例: 假设 words = ["practice ...

  8. java英语单词测试_Java 英语单词自测

    Java英语单词自测小游戏 编写初衷 记英语单词的时候,不知道记没记住,所以写了个检测的程序,在检测的同时,也能够复习之前学习的. 任务目标 创建数据库 Java编写代码(没写成GUI,觉着写成GUI ...

  9. 11、java常用单词(转载)

    abstract (关键字) 抽象 ['.bstr.kt] access vt.访问,存取 ['.kses]'(n.入口,使用权) algorithm n.算法 ['.lg.riem] annotat ...

  10. JAVA常用单词汇总

    Java 常用英语汇总 abstract (关键字) access 抽象 ['.bstr.kt] vt.访问,存取 ['.kses]'(n.入口,使用权) n.算法 ['.lg.riem] algor ...

最新文章

  1. Delphi7的主窗口
  2. 【Android】Parse开发笔记(1)—— 准备
  3. 电脑知识:分享实用的电脑维护小常识
  4. RuoYi-Vue 部署 Linux环境 若依前后端分离项目(jar包+nginx 多机版本)
  5. Navicat for MySQL 使用SSH方式链接远程数据库
  6. android webview capturepicture,android webView截图的4种方法
  7. Bokeh 增加交互方式
  8. ROS学习:智能车室外光电组仿真
  9. 单例模式2014-12
  10. IE报错,VS定位不到错误的常见原因
  11. flume与log4j的整合
  12. OFDM中的DC subcarrier
  13. 新版傻妞对接QQ完整版(10月24日)
  14. Ant安装与配置build.xml文件说明
  15. 微信小程序实现地图导航功能
  16. logstash解析iis日志
  17. cath数据库fasta备注_sam's note
  18. k8s :pod has unbound immediate PersistentVolumeClaims
  19. QGraphicsView图形视图框架使用(三)位移变换和图元定位
  20. 技术积累 — SecureCRT串口工具及其使用说明

热门文章

  1. Unity渲染顺序文章收集
  2. App常用的专项测试概述
  3. 策略梯度模型 (Policy Gradient)原理与实现
  4. wordpress获取指定分类文章数目的方法
  5. 一种基于Android、iOS平台的移动端车牌识别接口,实现手机扫描提取车牌号
  6. Centos7给ntpd服务指定日志文件
  7. 傅里叶变换的意义和理解(通俗易懂版)
  8. skew算法_一种新型Skew Tent映射的混沌混合优化算法
  9. VUE-组件以及插槽
  10. Spring boot+mybatis 编写接口(例:注册账号)