LeetCode 471 编码最短长度的字符串


文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
    • 题解代码分析
      • 为什么用区间 DP
      • 拆分的意义
      • 整体重复的判断逻辑
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

LeetCode 471《编码最短长度的字符串》是一道非常典型但也非常容易被低估的动态规划题
表面上看,它只是把字符串压缩成类似k[substring]的形式;但真正难的地方在于——什么时候该压缩,什么时候不该压缩,以及如何保证整体长度是最短的

这道题和真实业务里很多“字符串优化”“配置压缩”“协议编码”问题的思路是高度相通的。
本文会从直觉思路开始,逐步推到 DP 解法,并给出一个 Swift 的可运行 Demo。

描述

题目要求我们实现一个函数:

给定一个字符串s,对其进行编码,使编码后的字符串长度最短。

编码规则是:

  • 如果一个字符串可以表示为某个子串重复多次
  • 可以写成:k[encoded_string]
  • 其中k是重复次数,encoded_string是被重复的字符串

比如:

  • "aaaaa""5[a]"
  • "ababab""3[ab]"
  • "aabcaabcd""2[aabc]d"

但要注意一个非常重要的点:

如果编码后的字符串不比原字符串短,那就不要编码。

这句话,基本就是这道题 80% 的难点来源。

题解答案

这道题的核心思路可以总结为一句话:

用区间 DP,枚举每一个子串的最优编码结果。

我们用一个二维 DP:

dp[i][j] 表示字符串 s[i...j] 的最短编码结果

对于任意一个子串,我们有两种选择:

  1. 不做压缩,直接用原字符串

  2. 尝试压缩

    • 要么拆分成两段
    • 要么整个子串由某个更小的子串重复构成

最终取长度最短的那个方案。

![](https://i-blog.csdnimg.cn/direct/a0d338fa17054066953ec43bb8f178a1.png

题解代码分析

下面是完整的 Swift 实现代码,可以直接在 LeetCode 或本地 Swift 环境运行

classSolution{funcencode(_s:String)->String{letchars=Array(s)letn=chars.countifn==0{return""}// dp[i][j] 表示 s[i...j] 的最短编码字符串vardp=Array(repeating:Array(repeating:"",count:n),count:n)// 单个字符初始化foriin0..<n{dp[i][i]=String(chars[i])}// 按区间长度递增forlenin2...n{foriin0...n-len{letj=i+len-1letsubstring=String(chars[i...j])dp[i][j]=substring// 默认不编码// 情况一:拆分forkini..<j{letleft=dp[i][k]letright=dp[k+1][j]ifleft.count+right.count<dp[i][j].count{dp[i][j]=left+right}}// 情况二:整体重复letpattern=findRepeatPattern(substring)ifletp=pattern{lettimes=substring.count/p.countletencoded="\(times)[\(p)]"ifencoded.count<dp[i][j].count{dp[i][j]=encoded}}}}returndp[0][n-1]}// 判断字符串是否由某个子串重复构成privatefuncfindRepeatPattern(_s:String)->String?{letchars=Array(s)letn=chars.countforlenin1...n/2{ifn%len!=0{continue}letpattern=Array(chars[0..<len])varmatch=trueforiinstride(from:0,to:n,by:len){ifArray(chars[i..<i+len])!=pattern{match=falsebreak}}ifmatch{returnString(pattern)}}returnnil}}

题解代码分析

这段代码比较长,我们分几块慢慢聊。

为什么用区间 DP

这道题的编码是强子结构问题

  • 子串的最优解,会影响大串的最优解
  • 拆分位置不同,结果完全不同

所以:

  • 一维 DP 根本不够
  • 必须知道每个区间的最优编码

这也是dp[i][j]出现的原因。

拆分的意义

这段代码:

forkini..<j{letleft=dp[i][k]letright=dp[k+1][j]ifleft.count+right.count<dp[i][j].count{dp[i][j]=left+right}}

解决的是这种情况:

"aabcaabcd" = "aabc" + "aabcd"

有些字符串整体无法压缩,但拆开之后能变短。

这在实际场景中非常常见,比如:

  • 模板字符串
  • 日志前缀 + 重复内容
  • 协议字段拼接

整体重复的判断逻辑

这段是整题最容易写错的地方:

letpattern=findRepeatPattern(substring)

它的本质是在问:

这个字符串是不是由一个更短的字符串重复 N 次得到的?

我们做法非常直接:

  1. 枚举所有可能的子串长度len
  2. 判断能不能完整覆盖原字符串
  3. 每一段都严格相等才算成功

注意一个关键点:

即使可以压缩,也要比较长度,不能强行压。

这正是很多人第一次写这道题会踩的坑。

示例测试及结果

我们来跑几个经典用例。

letsolution=Solution()print(solution.encode("aaa"))// 3[a]print(solution.encode("ababab"))// 3[ab]print(solution.encode("aabcaabcd"))// 2[aabc]dprint(solution.encode("abcde"))// abcde

输出结果:

3[a] 3[ab] 2[aabc]d abcde

可以看到:

  • 能压缩的就压
  • 压了不划算的,坚决不动

这正是题目想要的效果。

时间复杂度

时间复杂度主要来自三部分:

  1. 区间 DP:O(n^2)
  2. 每个区间尝试拆分:O(n)
  3. 每次判断重复模式:O(n)

综合下来:

  • 时间复杂度是 O(n³)

虽然看起来不低,但题目本身对n的限制并不大,是完全可以接受的。

空间复杂度

  • 使用了一个n x n的 DP 表
  • 额外的字符串操作是常数级

所以:

  • 空间复杂度是 O(n²)

总结

LeetCode 471 是一道非常适合用来检验你是否真正理解区间 DP 的题

它至少同时考察了三点能力:

  1. 能不能正确建模子问题
  2. 能不能处理“压不压”的决策问题
  3. 能不能在字符串问题里保持足够的耐心和严谨

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

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

相关文章

Reachy Mini机器人硬件架构终极解析:从桌面伴侣到AI助手的技术演进

Reachy Mini机器人硬件架构终极解析&#xff1a;从桌面伴侣到AI助手的技术演进 【免费下载链接】reachy_mini Reachy Minis SDK 项目地址: https://gitcode.com/GitHub_Trending/re/reachy_mini 在当今机器人技术快速发展的时代&#xff0c;Reachy Mini以其独特的开源硬…

利用STM32H7实现FDCAN远程帧发送操作指南

STM32H7实战&#xff1a;如何用FDCAN发送远程帧&#xff0c;构建高效主从通信系统你有没有遇到过这样的场景&#xff1f;多个传感器节点在CAN总线上不停地广播数据&#xff0c;而主控却只关心其中一部分。结果就是——总线越来越堵&#xff0c;响应越来越慢&#xff0c;功耗越来…

不寻常交易量检测器:智能捕捉股市异常波动的GitHub工具

不寻常交易量检测器&#xff1a;智能捕捉股市异常波动的GitHub工具 【免费下载链接】UnusualVolumeDetector Gets the last 5 months of volume history for every ticker, and alerts you when a stocks volume exceeds 10 standard deviations from the mean within the last…

解锁网易云音乐无损音频:5分钟搭建专属音乐解析平台

解锁网易云音乐无损音频&#xff1a;5分钟搭建专属音乐解析平台 【免费下载链接】Netease_url 网易云无损解析 项目地址: https://gitcode.com/gh_mirrors/ne/Netease_url 还在为网易云音乐的高品质音频无法下载而烦恼吗&#xff1f;&#x1f3b5; 今天我要为你揭秘一个…

3步解决思源宋体在macOS上的显示模糊问题

3步解决思源宋体在macOS上的显示模糊问题 【免费下载链接】source-han-serif Source Han Serif | 思源宋体 | 思源宋體 | 思源宋體 香港 | 源ノ明朝 | 본명조 项目地址: https://gitcode.com/gh_mirrors/sou/source-han-serif 你是否在使用思源宋体时遇到过这样的困扰&a…

Qwen3-VL模型压缩教程:让8G显存电脑也能流畅运行

Qwen3-VL模型压缩教程&#xff1a;让8G显存电脑也能流畅运行 1. 为什么需要模型压缩&#xff1f; 最近我在二手市场淘到一块GTX1080显卡&#xff08;8G显存&#xff09;&#xff0c;想用它跑Qwen3-VL模型做些副业项目。但原版Qwen3-VL需要24G显存才能运行&#xff0c;这让我很…

Qwen3-VL图像描述新手指南:免环境配置,1小时出成果

Qwen3-VL图像描述新手指南&#xff1a;免环境配置&#xff0c;1小时出成果 引言&#xff1a;AI如何帮你自动写图片说明&#xff1f; 刚入行的自媒体创作者常常面临一个难题&#xff1a;每天要处理大量图片素材&#xff0c;手动编写每张图的描述既耗时又容易灵感枯竭。这时候&…

Win11禁用窗口圆角终极指南:完整教程与安全操作

Win11禁用窗口圆角终极指南&#xff1a;完整教程与安全操作 【免费下载链接】Win11DisableRoundedCorners A simple utility that cold patches dwm (uDWM.dll) in order to disable window rounded corners in Windows 11 项目地址: https://gitcode.com/gh_mirrors/wi/Win1…

AutoGLM-Phone-9B隐私保护:移动数据安全处理

AutoGLM-Phone-9B隐私保护&#xff1a;移动数据安全处理 随着多模态大语言模型在移动端的广泛应用&#xff0c;用户数据的安全与隐私保护成为技术落地的关键挑战。AutoGLM-Phone-9B 作为一款专为移动设备优化的轻量级多模态模型&#xff0c;在实现高效推理的同时&#xff0c;也…

AugmentCode自动化测试助手:智能邮箱生成与表单填充解决方案

AugmentCode自动化测试助手&#xff1a;智能邮箱生成与表单填充解决方案 【免费下载链接】free-augment-code AugmentCode 无限续杯浏览器插件 项目地址: https://gitcode.com/gh_mirrors/fr/free-augment-code 在软件开发与测试的日常工作中&#xff0c;频繁创建测试账…

终极指南:GitHub Desktop中文界面完美汉化全攻略

终极指南&#xff1a;GitHub Desktop中文界面完美汉化全攻略 【免费下载链接】GitHubDesktop2Chinese GithubDesktop语言本地化(汉化)工具 项目地址: https://gitcode.com/gh_mirrors/gi/GitHubDesktop2Chinese 还在为GitHub Desktop的英文界面感到困扰吗&#xff1f;Gi…

AutoGLM-Phone-9B应用案例:工业质检视觉系统开发

AutoGLM-Phone-9B应用案例&#xff1a;工业质检视觉系统开发 随着智能制造的快速发展&#xff0c;工业质检正从传统人工检测向智能化、自动化方向演进。在这一转型过程中&#xff0c;多模态大语言模型&#xff08;MLLM&#xff09;凭借其强大的跨模态理解与推理能力&#xff0…

高效智能歌词管理:LDDC完全免费使用全攻略

高效智能歌词管理&#xff1a;LDDC完全免费使用全攻略 【免费下载链接】LDDC 精准歌词(逐字歌词/卡拉OK歌词)歌词获取工具,支持QQ音乐、酷狗音乐、网易云平台,支持搜索与获取单曲、专辑、歌单的歌词 | Accurate Lyrics (verbatim lyrics) Retrieval Tool, supporting QQ Music,…

Kubernetes 核心源码机制与扩展开发全解析

📖 引言 理解 Kubernetes 的核心模块源码及其扩展机制,能让你更深入地掌握这个容器编排平台,甚至具备对其进行定制与优化的能力。本文将从核心架构、关键源码机制入手,逐步展开到主流扩展方式,并给出实践建议。 🏗 核心架构与扩展机制概览 模块/机制 核心职责 关键源码…

智能测试数据生成系统的创新应用:提升开发效率的技术实践

智能测试数据生成系统的创新应用&#xff1a;提升开发效率的技术实践 【免费下载链接】free-augment-code AugmentCode 无限续杯浏览器插件 项目地址: https://gitcode.com/gh_mirrors/fr/free-augment-code 在现代软件开发流程中&#xff0c;测试数据生成已成为影响开发…

鸿蒙应用 CPU 使用率过高怎么办?从 Profiler 到落地优化的完整思路

摘要 在鸿蒙&#xff08;HarmonyOS / OpenHarmony&#xff09;应用开发中&#xff0c;很多开发者在功能完成后都会遇到一个问题&#xff1a; 页面不算复杂&#xff0c;但 CPU 使用率却一直偏高&#xff0c;真机一跑就发热、掉帧&#xff0c;Profiler 一看主线程红成一片。 实际…

AutoGLM-Phone-9B金融风控:移动端实时监测方案

AutoGLM-Phone-9B金融风控&#xff1a;移动端实时监测方案 随着移动设备在金融服务中的广泛应用&#xff0c;如何在资源受限的终端上实现高效、精准的风险识别成为行业关注的核心问题。传统风控系统依赖云端推理&#xff0c;存在延迟高、隐私泄露风险大、网络依赖性强等痛点。…

VutronMusic:开启你的数字音乐新纪元

VutronMusic&#xff1a;开启你的数字音乐新纪元 【免费下载链接】VutronMusic 高颜值的第三方网易云播放器&#xff0c;支持本地音乐播放、离线歌单、桌面歌词、Touch Bar歌词、Mac状态栏歌词显示、Linux-gnome桌面状态栏歌词显示。支持 Windows / macOS / Linux :electron: …

ControlNet++ ProMax:重新定义AI图像生成与编辑的技术革命

ControlNet ProMax&#xff1a;重新定义AI图像生成与编辑的技术革命 【免费下载链接】controlnet-union-sdxl-1.0 项目地址: https://ai.gitcode.com/hf_mirrors/xinsir/controlnet-union-sdxl-1.0 你是否曾经遇到过这样的困扰&#xff1a;想要生成一张特定姿态的人物图…

Qwen3-VL持续集成实践:GPU云实例自动化测试流水线

Qwen3-VL持续集成实践&#xff1a;GPU云实例自动化测试流水线 1. 为什么需要GPU云实例的CI/CD流水线 在AI模型开发中&#xff0c;持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;已经成为提升开发效率的关键。但对于像Qwen3-VL这样的多模态大模型&a…