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

贪心算法题解——划分字母区间【LeetCode】

763. 划分字母区间

本题目,“同一字母最多出现在一个片段中”,因为这句话,所以本质上

这道题目属于合并区间


一、算法逻辑(逐步思路)

✅ 目标:

将字符串 s 划分成尽可能多的片段,要求:

  • 每个字母最多只出现在一个片段中;
  • 所有片段拼接后仍是原始字符串;
  • 返回每个片段的长度。

✅ 实现逻辑:

  1. 先预处理:
    • 用字典 last 记录字符串中每个字母最后一次出现的位置
    • 例如:s = "ababcbacadefegdehijhklij",其中 'a' 最后出现在 8,'e' 出现在 15,等等。
  1. 开始遍历划分:
    • 初始化两个指针:start 表示当前片段的起点,end 表示当前片段的最远右端;
    • 遍历字符串:
      • 对每个字符 c,更新当前片段的 endmax(end, last[c])
      • 如果当前位置 i == end,说明这个片段封闭了(它包含了所有出现在其中字符的最后位置):
        • 计算这个片段的长度为 end - start + 1
        • 把它加入答案;
        • 然后更新 start = i + 1,准备开始下一个片段。

二、算法核心点

✅ 核心思想:贪心策略 + 动态区间合并

  • 核心贪心策略是:
    • 对于当前片段内出现的所有字母,都要等它们“最后一次出现”后,才可以结束这个片段;
    • 所以,我们用 end 表示当前片段中所有字符的最远结束点
    • 一旦遍历指针 i 到达 end,说明这个片段所有相关字符都封闭了,可以切一刀。
  • 这个过程贪心的地方在于:
    • 每次划分尽可能早地结束当前片段(在刚好满足“所有字符都只出现在一个片段”的条件下),从而得到更多的片段。
class Solution:def partitionLabels(self, s: str) -> List[int]:last = {c: i for i, c in enumerate(s)}  # 每个字母最后出现的下标ans = []start = end = 0for i, c in enumerate(s):end = max(end, last[c])  # 更新当前区间右端点的最大值if end == i:  # 当前区间合并完毕ans.append(end - start + 1)  # 区间长度加入答案start = i + 1  # 下一个区间的左端点return ans

三、复杂度分析

  • 时间复杂度:O(n)
    • 第一次遍历构造 last:O(n);
    • 第二次遍历划分字符串:O(n);
    • 总共是线性时间复杂度。
  • 空间复杂度:O(1)(常数级)
    • 虽然用了一个字典 last,但它最多存 26 个小写字母,属于常数空间。

✅ 总结表:

维度

内容

✅ 思路逻辑

利用每个字符最后出现位置,动态维护区间右边界,贪心切片

✅ 核心技巧

贪心:延迟切片直到当前片段中所有字母的最后出现位置都包含为止

✅ 时间复杂度

O(n),两次遍历字符串

✅ 空间复杂度

O(1),字母表大小固定,最多用 26 个键值对

http://www.lryc.cn/news/585954.html

相关文章:

  • 【LeetCode453.最小操作次数使数组元素相等】
  • 代码训练LeetCode(45)旋转图像
  • 【Linux-云原生-笔记】Apache相关
  • 【Modern C++ Part9】Prefer-alias-declarations-to-typedefs
  • 内网穿透系列九:开源的网络穿透与组网工具 EasyTier,支持多种数据传输通道,去中心化,兼具高效与安全
  • Kafka Schema Registry:数据契约管理的利器
  • 对日开发 秀丸文本编辑器 添加文本变换模块
  • 聊一聊Spring框架接口测试常见场景有哪些?
  • 学习C++、QT---22(QT中QTextStream库读取文件、写入文件的讲解)
  • docker搭建 与镜像加速器
  • win10安装Rust Webassembly工具链(wasm-pack)报错。
  • C++中Lambda表达式 [ ] 的写法
  • AI 时代的分布式多模态数据处理实践:我的 ODPS 实践之旅、思考与展望
  • 深入解析 Stack 和 Queue:从原理到实战应用
  • 每日算法刷题Day46 7.12:leetcode前缀和3道题和差分2道题,用时1h30min
  • pgsql模板是什么?
  • Redis Geospatial 功能详解及多边形包含判断实现
  • 【JVM|类加载】第三天
  • 专业硬件检测工具 AIDA64 Extreme V7.70.7500 至尊版
  • 12. JVM的垃圾回收器
  • 1. 好的设计原则
  • Java应用全链路故障排查实战指南:从系统资源到JVM深度诊断
  • 钉钉小程序开发环境配置与前端开发指南
  • 【小沐杂货铺】基于Three.JS绘制汽车展示Car(WebGL、vue、react、autoshow、提供全部源代码)
  • 关于 验证码系统 详解
  • Ubuntu安装Jenkins
  • Java文件传输要点
  • 大数据在UI前端的应用深化研究:用户行为数据的时序模式挖掘
  • 前端内容-ES6
  • Java使用Langchai4j接入AI大模型的简单使用(一)