当前位置: 首页 > news >正文

LeetCode 820 单词的压缩编码题解

LeetCode 820 单词的压缩编码题解

题目描述

题目链接
给定一个单词列表,将其编码为一个索引字符串S,格式为"单词1#单词2#…"。要求当某个单词是另一个单词的后缀时,该单词可以被省略。求最终编码字符串的最小长度。

解题思路

逆序前缀树法

  1. 逆序建树:将单词逆序插入前缀树(如"time"→"emit")
    逆序插入原理 将单词逆序后插入前缀树,使得:
    • me → em 成为 time → emit 的前缀路径
    • 在树结构中, em 路径会被 emit 完全包含
    • 通过检查路径末端是否为叶子节点判断是否需要保留
  2. 统计叶子:只有叶子节点对应的单词需要保留
    • me 的逆序 em 路径末端仍有子节点(继续通向 i )
    • time 的逆序 emit 路径末端是叶子节点
    • 因此只保留 time 和 bell
  3. 计算长度:每个保留单词的长度+1(#号)
    每个保留单词的贡献长度为:
    原长度 + 1(#号分隔符)
    示例计算: time(4) + 1 + bell(4) + 1 = 10

完整代码实现

from typing import Listclass TrieNode:def __init__(self):self.children = {}  # 存储子节点class Solution:def minimumLengthEncoding(self, words: List[str]) -> int:# 1. 构建逆序前缀树root = TrieNode()# 用字典保存单词最后节点和单词长度nodes = {}for word in set(words):  # 去重处理node = root# 逆序插入字符for c in reversed(word):if c not in node.children:node.children[c] = TrieNode()node = node.children[c]nodes[node] = len(word) + 1  # 存储单词长度+1(#号)# 2. 统计需要保留的单词长度total = 0for node, length in nodes.items():if not node.children:  # 叶子节点(无子节点)total += lengthreturn totalif __name__ == "__main__":# 测试用例test1 = Solution().minimumLengthEncoding(["time", "me", "bell"])  # 10test2 = Solution().minimumLengthEncoding(["t"])  # 2print(test1, test2)

相关文章:

  • 笔记本电脑打开网页很慢,一查ip地址网段不对怎么处理
  • 数学建模初等模型应用
  • 影刀RPA网页自动化总结
  • TCP 三次握手建立连接详解
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】附录-B. 错误代码与解决方案
  • AWS技术助力企业满足GDPR合规要求
  • MATLAB 中常用的微分函数介绍
  • 武汉科技大学人工智能与演化计算实验室许志伟课题组参加2025中国膜计算论坛
  • 网络运维过程中的常用命令
  • 安装npm:npm未随Node.js一起安装
  • 深度学习基础知识
  • 5月13日日记
  • 【行为型之策略模式】游戏开发实战——Unity灵活算法架构的核心实现策略
  • python三方库sqlalchemy
  • 【IDEA】注释配置
  • 【SSL部署与优化​】​​如何为网站启用HTTPS:从Let‘s Encrypt免费证书到Nginx配置​​
  • 服务器数据恢复—XFS文件系统分区消失的数据恢复案例
  • 网络互联技术深度解析:理论、实践与进阶指南
  • PYTHON训练营DAY25
  • vs_code 调试python文件
  • 紫光集团原董事长赵伟国一审被判死缓
  • 山西临汾哪吒主题景区回应雕塑被指抄袭:造型由第三方公司设计
  • 因操纵乙烯价格再遭诉讼,科莱恩等四家企业被陶氏索赔60亿
  • 海运港口股掀涨停潮!回应关税下调利好,有货代称美线舱位爆了
  • 回望乡土:对媒介化社会的反思
  • 普京:俄中关系是国家间关系的真正典范