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

贪心算法题解——划分字母区间【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.xdnf.cn/news/15134.html

相关文章:

  • Tom 和 Jerry 的网格迷宫大冒险
  • 深入理解设计模式:原型模式(Prototype Pattern)
  • Spring Boot 应用中,配置的加载优先级
  • 前端MQTT入门指南:从零到实战的完整流程
  • 利用scale实现图片放大案例
  • 家用智能摄像机PRV文件删除的恢复方法
  • 设计模式 - 反转原则:DIP(Dependence Inversion Principle)最佳实践
  • 手机识别数据集,2628张原始图片,支持yolo,coco json,pasical voc xml等格式的标注
  • Nginx 中的负载均衡策略
  • TensorFlow2 study notes[1]
  • NW710NW713美光固态闪存NW719NW720
  • 【每日刷题】回文数
  • c语言中的数组IV
  • 奇哥面试:RabbitMQ工作模式深度剖析与Spring整合MQ
  • Datawhale AI夏令营:基于带货视频评论的用户洞察挑战赛上分全攻略
  • 数据库系统的基础知识(三)
  • 【时时三省】(C语言基础)通过指针引用数组元素
  • Redis 分片集群
  • C++中的智能指针(1):unique_ptr
  • 《汇编语言:基于X86处理器》第7章 整数运算(2)
  • 星云穿越与超光速飞行特效的前端实现原理与实践
  • 上位机知识篇---Linux软硬链接
  • 用 ELK+Filebeat 提高50%问题排查效率,这套方案实测有效!
  • cnpm exec v.s. npx
  • Shader面试题100道之(81-100)
  • python之set详谈
  • LeetCode经典题解:128、最长连续序列
  • TCP服务器与客户端三种方法实现
  • Linux权限的概念
  • SM712.TCT Semtech TVS二极管——电子设备的终极电路守护