第六天——贪心算法——字符串分隔

1. 题目

给定一个字符串 s,我们需要将其划分为尽可能多的部分,使得同一字母最多出现在一个部分中。

例如:字符串 "ababcc" 可以划分为 ["abab", "cc"],但要避免 ["aba", "bcc"] 或 ["ab", "ab", "cc"] 这样的划分方式(因为它们包含了同一个字母出现在多个部分的情况)。

注意:划分后的部分顺序必须与原字符串顺序一致,所有部分拼接起来仍然等于 s。
返回:这些部分的长度组成的列表。

2. 分析

这道题目是一个典型的贪心算法问题,解法类似于区间合并问题

关键思路

  1. 记录每个字母的最远出现位置
    • 用 last_occurrence 字典保存每个字符在字符串 s 中最后出现的位置(即最右边的索引),这样可以确定该字符所属的最小子串范围。
  2. 滑动窗口遍历,确定当前部分的结束点
    • 用 start 和 end 表示当前部分的起始和结束位置。
    • 遍历字符串时,不断更新 end,使其变为已遍历字符的最远出现位置。
    • 当 i == end 时,说明当前部分可以切分,记录长度,并更新 start 到 end + 1

3. 完整代码

def partition_labels(s):last_occurrence = {char: idx for idx, char in enumerate(s)}  # 记录每个字母的最后出现位置start = end = 0result = []for i, char in enumerate(s):end = max(end, last_occurrence[char])  # 更新当前部分的结束点if i == end:  # 找到一个符合条件的部分result.append(end - start + 1)start = end + 1  # 更新下一部分的起始点return result
print(partition_labels("ababcc"))

示例分析:s = "ababcc"

  1. last_occurrence = {'a': 2, 'b': 3, 'c': 5}
  2. 遍历过程:
    • i = 0char = 'a'end = max(0, 2) = 2
    • i = 1char = 'b'end = max(2, 3) = 3
    • i = 2char = 'a'(满足 i == end = 2),记录长度 2 - 0 + 1 = 3"aba")❌?
    • (这里需要更正!i = 2 时的 end = 3,不等于 i,不会触发 append。)
    • i = 3char = 'b'(满足 i == end = 3),记录长度 3 - 0 + 1 = 4"abab"
    • i = 4char = 'c'end = max(3, 5) = 5
    • i = 5char = 'c'(满足 i == end = 5),记录长度 5 - 4 + 1 = 2"cc"
  3. 最终结果[4, 2]["abab", "cc"])✅

partition_labels 算法中,end 表示当前部分的最远结束位置。为了保证同一字符仅出现在一个部分里,我们需要确保其所有出现的范围都能被当前部分完全覆盖max(end, last_occurrence[char]) 的作用是不断扩展当前部分的右边界,以确保:当前字符的所有出现都被覆盖,后续字符不会跨越当前部分。

s = "ababcc" 为例:

字符 charlast_occurrence[char]end(更新前)new_end = max(end, last)操作
'a' (i=0)20max(0, 2) = 2end=2
'b' (i=1)32max(2, 3) = 3end=3
'a' (i=2)23max(3, 2) = 3end=3
'b' (i=3)33max(3, 3) = 3触发分割
'c' (i=4)53max(3, 5) = 5end=5
'c' (i=5)55max(5, 5) = 5触发分割

i == end 时,触发分隔的原因:

说明:当前部分的所有字符已经处理完毕,

  • 已经遍历到 i = end,且在这个位置之前的所有字符的最远出现位置 last_occurrence[char] 都 ≤ end(因为 end 是由 max(last_occurrence[char]) 决定的)。
  • 换句话说,这个部分已经囊括了所有必须包含的字符(同一字母的所有出现都被包含在当前部分)。

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

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

相关文章

[原创](现代Delphi 12指南):[macOS 64bit App开发]: 注意“回车换行“的跨平台使用.

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…

Maven 插件参数注入与Mojo开发详解

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

扩增子分析|R分析之微生物生态网络稳定性评估之节点和连接的恒常性、节点持久性以及组成稳定性指数计算

一、引言 周集中老师团队于2021年在Nature climate change发表的文章,阐述了网络稳定性评估的原理算法,并提供了完整的代码。自此对微生物生态网络的评估具有更全面的指标,自此网络稳定性的评估广受大家欢迎。本文将介绍网络稳定性之节点和连…

人体肢体渲染-一步几个脚印从头设计数字生命——仙盟创梦IDE

人体肢体动作数据集-太极拳 渲染代码 # 初始化Pygame pygame.init()# 设置窗口尺寸 WINDOW_WIDTH 800 WINDOW_HEIGHT 600 window pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption("动作回放")# 设置帧率 FPS 30 clock pyg…

强化学习入门:马尔科夫奖励过程

文章目录 前言1、组成部分2、应用例子3、马尔科夫奖励过程总结 前言 最近想开一个关于强化学习专栏,因为DeepSeek-R1很火,但本人对于LLM连门都没入。因此,只是记录一些类似的读书笔记,内容不深,大多数只是一些概念的东…

腾讯开源实时语音大模型VITA-audio,92mstoken极速响应,支持多语言~

简介 VITA-Audio 是一个由腾讯优图实验室(Tencent Youtu Lab)、南京大学和厦门大学的研究人员共同开发的项目,旨在解决现有语音模型在流式生成(streaming)场景下生成第一个音频令牌(token)时的高…

测序的原理

Sanger 测序原理 https://v.qq.com/x/page/d0124c0k44t.html illumina 测序原理: https://v.qq.com/x/page/i0770fd7r9i.html PacBio 第三代 SMRT 单分子测序 https://v.qq.com/x/page/r03534cry7u.html Ion torrent 测序原理 https://v.qq.com/x/page/v01754s6r82.…

高项-逻辑数据模型

逻辑数据模型的核心理解 1. 定义与特点 逻辑数据模型(Logical Data Model, LDM): 是一种抽象的数据结构设计,用于描述业务实体(如客户、订单)及其关系(如“客户下单”)&#xff0c…

《数字分身进化论:React Native与Flutter如何打造沉浸式虚拟形象编辑》

React Native,依托JavaScript语言,借助其成熟的React生态系统,开发者能够快速上手,将前端开发的经验巧妙运用到移动应用开发中。它通过JavaScript桥接机制调用原生组件,实现与iOS和Android系统的深度交互,这…

提高绳牵引并联连续体机器人运动学建模精度的基于Transformer的分段学习方法

合肥工业大学王正雨老师团队针对绳牵引并联连续体机器人的运动学建模提出一种基于Transformer网络的分段学习方法,该方法较传统建模性能卓越、精度更高。相关研究论文“Transformer-based segmented learning for kinematics modelling of a cable-driven parallel …

【PX4飞控】在 Matlab Simulink 中使用 Mavlink 协议与 PX4 飞行器进行交互

这里列举一些从官网收集的比较有趣或者实用的功能。 编写 m 脚本与飞行器建立 UDP 连接,并实时可视化 Mavlink 消息内容,或者读取脚本离线分析数据。不光能显示 GPS 位置或者姿态等信息的时间曲线,可以利用 Matlab Plot 功能快速定制化显示一…

Oracle中的select1条、几条、指定范围的语句

在Oracle中,可以使用不同的方法来选择一条记录、多条记录或指定范围内的记录。以下是具体的实现方式: 1. 查询单条记录 使用ROWNUM伪列限制结果为1条: SELECT * FROM your_table WHERE ROWNUM 1;特点:Oracle会在结果集生成时分…

自营交易考试为何出圈?一场模拟交易背后的真实竞争

在交易圈里,有个现象正在悄悄发生:越来越多交易员开始主动报名参与一类“非实盘”的考试,原因却并不复杂。不是为了资格证书,也不是为了炫技,而是为了一个更实在的东西——稳定、透明的利润分成,以及一次向…

一键生成达梦、Oracle、MySQL 数据库 ER 图!解锁高效数据库设计!

从事企业软件项目开发的同学们一定对 ER 图很熟悉,可以帮助用户快速厘清数据库结构,方便后续维护和优化。但是在日常工作中,面对复杂的数据结构,整理表设计文档对于每一位DBA来说都很头大,需要将设计细节转化为条理清晰…

游戏行业DDoS攻击类型及防御分析

游戏行业作为DDoS攻击的高发领域,攻击类型复杂多样,结合多个来源的信息,以下是其主要攻击类型及特征分析: 1. 传统流量型DDoS攻击 UDP洪水攻击:通过大量UDP报文淹没服务器端口,消耗带宽资源,导…

Web 架构之状态码全解

文章目录 一、引言二、状态码分类2.1 1xx 信息性状态码2.2 2xx 成功状态码200 OK201 Created204 No Content 2.3 3xx 重定向状态码301 Moved Permanently302 Found304 Not Modified 2.4 4xx 客户端错误状态码400 Bad Request401 Unauthorized403 Forbidden404 Not Found 2.5 5x…

jedis+redis pipeline诡异的链接损坏、数据读取异常问题解决

文章目录 问题现象栈溢出(不断的重连)读取超时未知响应尝试读取损坏的链接读取到的数据和自己要读的无关,导致空指针、类型转换错误,数据读取错乱 问题写法问题分析修复注意点 问题现象 栈溢出(不断的重连&#xff09…

c++STL-list的模拟实现

cSTL-list的模拟实现 list源码剖析list模拟实现list构造函数拷贝构造函数赋值重载迭代器 iterator访问结点数size和判空尾插 push_back头插 push_front尾删pop_back头删pop_front插入 insert删除 erase清空clear和析构函数访问结点 参考程序 list源码剖析 建议先看cSTL-list的…

WeakAuras Lua Script ICC (BarneyICC)

WeakAuras Lua Script ICC (BarneyICC) https://wago.io/BarneyICC/69 全量英文字符串: !WA:2!S33c4TXX5bQv0kobjnnMowYw2YAnDKmPnjnb4ljzl7sqcscl(YaG6HvCbxaSG7AcU76Dxis6uLlHNBIAtBtRCVM00Rnj8Y1M426ZH9XDxstsRDR)UMVCTt0DTzVhTjNASIDAU…

校园网规划与设计方案

一、项目概述 校园网是学校实现信息化教学、科研与管理的重要基础设施,其性能与稳定性直接影响学校的整体发展。随着学校规模不断扩大、教学科研活动日益丰富,对校园网的带宽、可靠性、安全性以及智能化管理等方面提出了更高要求。本规划与设计方案旨在构建一个高速、稳定、…