LeetCode 热题 100_划分字母区间(80_763_中等_C++)(贪心算法(求并集))

LeetCode 热题 100_划分字母区间(80_763)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(贪心算法(求交集)):
      • 代码实现
        • 代码实现(思路一(贪心算法(求并集)):
        • 以思路一为例进行调试

题目描述:

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。例如,字符串 “ababcc” 能够被分为 [“abab”, “cc”],但类似 [“aba”, “bcc”] 或 [“ab”, “ab”, “cc”] 的划分是非法的。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。

返回一个表示每个字符串片段的长度的列表。

输入输出样例:

示例 1:
输入:s = “ababcbacadefegdehijhklij”
输出:[9,7,8]
解释
划分结果为 “ababcbaca”、“defegde”、“hijhklij” 。
每个字母最多出现在一个片段中。
像 “ababcbacadefegde”, “hijhklij” 这样的划分是错误的,因为划分的片段数较少。

示例 2:
输入:s = “eccbbbbdec”
输出:[10]

提示:
1 <= s.length <= 500
s 仅由小写英文字母组成

题解:

解题思路:

思路一(贪心算法(求交集)):

1、题目要求同一字母最多出现在一个片段中。所以需求求出相交字母区间的并集。可以先遍历一遍字符串记录每个字母最后出现的位置。再从左往右遍历一遍,则必定先访问每个字母第一次出现的位置。将相交的字母区间求并集。

2、具体思路如下:
① 遍历一遍字符串记录每个字母最后出现的位置。
② 再从左往右遍历一遍,当碰到一个字母时判断当前字母最后出现的位置是否比之前字母出现的最远位置远,更新最远位置。
③ 当遍历到遍历过字母的最远位置时,记录区间中元素的个数,并重复 ② 和 ③ 过程,直到遍历完整个数组。

例: s=“ababc”
记录字母出现的最远位置 last_position={a:2,b:3,c:4}
再从左往右遍历一遍:
① left=0,right=0。(left为当前区间的最左侧位置,right为当前区间的最远位置)
② i=0,字母a的最远位置为2,right=2
③ i=1,字母b的最远位置为3,right=3
④ i=2,字母a的最远位置为2,right=3
⑤ i=3,字母b的最远位置为3,right=3,i==right 记录区间元素个数 right-left+1=4。left=i+1=4
⑥ i=4,字母4的最远位置为4,right=4,i ==right记录区间元素个数 right-left+1=1。

3、复杂度分析:
① 时间复杂度:O(n),其中 n 是字符串的长度。需要遍历字符串两次。
② 空间复杂度:O(∣Σ∣),其中 Σ 是字符串中的字符集。这道题中,字符串只包含小写字母,因此 ∣Σ∣=26。

代码实现

代码实现(思路一(贪心算法(求并集)):
class Solution {
public:vector<int> partitionLabels(string s) {// 用于存储每个字母最后出现的位置,初始化为-1vector<int> last_position(26, -1);  vector<int> ans;  // 存储结果,保存每个分割部分的长度// 记录每个字母最后出现的位置for (int i = 0; i < s.size(); i++) {// 'a' -> 0, 'b' -> 1, ..., 'z' -> 25last_position[s[i] - 'a'] = i;  }int left = 0, right = 0;  // left指向当前分区的起始位置,right指向当前分区的结束位置for (int i = 0; i < s.size(); i++) {// 更新当前字母的最后出现位置,right表示当前分区的结束位置right = max(right, last_position[s[i] - 'a']);  // 如果当前索引i已经到达该分区的最后位置,说明当前分区结束if (i == right) {// 记录当前分区的长度ans.push_back(right - left + 1);  left = i + 1;  // 更新下一个分区的起始位置}}// 返回所有分区的长度return ans;  }
};
以思路一为例进行调试
#include<iostream>
#include<vector>
using namespace std;class Solution {
public:vector<int> partitionLabels(string s) {// 用于存储每个字母最后出现的位置,初始化为-1vector<int> last_position(26, -1);  vector<int> ans;  // 存储结果,保存每个分割部分的长度// 记录每个字母最后出现的位置for (int i = 0; i < s.size(); i++) {// 'a' -> 0, 'b' -> 1, ..., 'z' -> 25last_position[s[i] - 'a'] = i;  }int left = 0, right = 0;  // left指向当前分区的起始位置,right指向当前分区的结束位置for (int i = 0; i < s.size(); i++) {// 更新当前字母的最后出现位置,right表示当前分区的结束位置right = max(right, last_position[s[i] - 'a']);  // 如果当前索引i已经到达该分区的最后位置,说明当前分区结束if (i == right) {// 记录当前分区的长度ans.push_back(right - left + 1);  left = i + 1;  // 更新下一个分区的起始位置}}// 返回所有分区的长度return ans;  }
};int main(int argc, char const *argv[])
{string str="ababcbacadefegdehijhklij";Solution s;vector<int> ans= s.partitionLabels(str);for (auto &i : ans){cout<<i<<" ";}return 0;
}

LeetCode 热题 100_划分字母区间(80_763)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

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

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

相关文章

机器学习——KNN超参数

sklearn.model_selection.GridSearchCV 是 scikit-learn 中用于超参数调优的核心工具&#xff0c;通过结合交叉验证和网格搜索实现模型参数的自动化优化。以下是详细介绍&#xff1a; 一、功能概述 GridSearchCV 在指定参数网格上穷举所有可能的超参数组合&#xff0c;通过交叉…

STM32基础教程——定时器

前言 TIM定时器&#xff08;Timer&#xff09;:STM32的TIM定时器是一种功能强大的外设模块&#xff0c;通过时基单元&#xff08;包含预分频器、计数器和自动重载寄存器&#xff09;实现精准定时和计数功能。其核心原理是&#xff1a;内部时钟&#xff08;CK_INT&#xff09;或…

[特殊字符] 树莓派声卡驱动原理全解析:从模拟耳机口到HiFi DAC

一、为什么要关注树莓派的声卡驱动&#xff1f; 树莓派&#xff08;Raspberry Pi&#xff09;作为一款广泛应用的单板计算机&#xff0c;集成了多种音频输出接口&#xff08;如 3.5mm 耳机、HDMI、I2S 外接 DAC 等&#xff09;。但许多用户在使用中会遇到诸如“耳机输出杂音”…

使用若依AI生成springBoot的前后端分离版本

目录 1. 从Git上面下载前后端分离版本 2. 执行SQL脚本 3. 初始化前端 安装Node.js和npm配置 ✅ 第一步&#xff1a;在 Node 安装目录下创建两个文件夹 ✅ 第二步&#xff1a;配置 npm 全局目录和缓存目录 ✅ 第三步&#xff1a;验证配置是否成功 ✅ 第四步&#xff1a;…

神聖的綫性代數速成例題12. 齊次方程組零解充要條件、其齊次方程組非零解、 齊次方程組基礎解系

1. 綫性空間的定義&#xff1a; 設是一個非空集合&#xff0c;是一個數域。 在集合的元素之間定義了加法運算&#xff0c;即對於任意&#xff0c;有唯一的&#xff0c;使得&#xff1b;在數域與集合的元素之間定義了數乘運算&#xff0c;即對於任意和&#xff0c;有唯一的&am…

万亿级数据量的OceanBase应用从JVM到协议栈立体化改造实现性能调优

本文基于某电商平台亿级商品详情页场景&#xff0c;通过Java应用层与数据库层的协同优化&#xff0c;实现98%的查询响应时间低于50ms。 一、JDBC连接池深度调优 HikariCP配置示例&#xff1a; HikariConfig config new HikariConfig(); config.setJdbcUrl("jdbc:ocean…

腾讯:《详解DeepSeek:模型训练、优化及数据处理的技术精髓》23页|附下载方法

导 读 INTRODUCTION 这是一篇来自腾讯的关于DeepSeek大语言模型及其技术特点、应用场景和未来发展趋势的文章&#xff0c;主要介绍了DeepSeek的核心技术优势、行业应用案例以及在AI领域的竞争力和发展趋势。为理解DeepSeek大语言模型的技术优势和应用前景提供了深入的分析&…

Vue 入门到实战 五

第5章 过渡与动画 目录 5.1 单元素/组件过渡 5.1.1 过渡class 5.1.2 CSS 过渡 5.1.3 CSS 动画 5.1.4 同时使用过渡和动画 5.1.5 JavaScript 钩子方法 5.2 多元素/组件过渡 5.2.1 多元素过渡 5.2.2 多组件过渡 5.3 列表过渡 5.3.1 列表的普通过渡 5.3.2 列表的平滑…

L2TP实验

一、拓朴图 二、实验配置 1.基础配置 1.1接口IP及服务配置 [PPPoE Client]interface GigabitEthernet 0/0/0 [PPPoE Client-GigabitEthernet0/0/0]service-manage all permit [NAS]interface GigabitEthernet 0/0/0 [NAS-GigabitEthernet0/0/0]ip add 192.168.0.2 24 [NAS-Gi…

简单实用!百度AI + Raphael AI = 免费生图

简单实用&#xff01;百度AI Raphael AI 免费生图 -- ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b55eda9141d34697b05db0cd60f62b75.png#pic_center) 第一步&#xff1a;下载或截取一些好看的图片当参考图片 第二步&#xff1a;用百度AI描述你想要的图片&…

aws(学习笔记第三十四课) dockerized-app with asg-alb

文章目录 aws(学习笔记第三十四课) dockerized-app with asg-alb学习内容&#xff1a;1. 整体架构1.1 代码链接1.2 代码手动修改部分1.2.1 rds_stack.py1.2.2 efs_stack.py1.2.3 asg_stack.py1.2.4 userdata.sh 1.2 整体架构 2.代码解析2.1 全体app.py2.2 NetworkStatck网络2.3…

面试总结之 Glide自定义的三级缓存策略

一、为什么需要三级缓存&#xff1f; 在移动应用开发中&#xff0c;图片加载性能直接影响用户体验。根据 Google 统计&#xff0c;图片加载延迟超过 1 秒会导致 32% 的用户流失。传统图片加载方案存在以下痛点&#xff1a; 内存占用高&#xff1a;未压缩的大图直接占用大量内…

用Python实现交互式数据可视化:从基础图表到动态仪表板

用Python实现交互式数据可视化&#xff1a;从基础图表到动态仪表板 一、项目背景 本文将通过一个完整的Python项目&#xff0c;展示如何使用Plotly和ipywidgets构建从基础统计到动态交互的全栈数据可视化方案。 二、核心功能模块 1. 数据生成与预处理 np.random.seed(100)…

Linux进程信号

1.信号的认识 生活中例如闹钟&#xff0c;红绿灯&#xff0c;电话铃声等都属于信号&#xff0c;所白了信号就是中断我们正在做的事情&#xff0c;属于进行事件异步通知机制。 在Linux中信号是发给进程的&#xff0c;信号的产生相较于进程是异步的。 信号的相关知识点&#xff…

Java使用FFmpegFrameGrabber进行视频拆帧,结合Thumbnails压缩图片保存到文件夹

引入依赖 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.17</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ja…

c++项目-KV存储-模仿redis实现kv键值对存储的基本功能。

KV存储引擎的技术解析&#xff1a;数组、哈希与红黑树实现及其在网络I/O中的应用。 内容概要&#xff1a;本文档深入介绍了基于数组、哈希表和红黑树的键值存储引擎的设计与实现。文档首先阐述了系统的总体架构与类图关系&#xff0c;之后分别对底层存储结构进行了详细解释&am…

vue3:十一、主页面布局(优化页面跳转方式)

:router"true" 一、参考文章 vue3:十一、主页面布局(实现基本左侧菜单右侧内容效果)-CSDN博客 参考上述文章可知&#xff0c;页面跳转是通过在js中定义的菜单中携带的path&#xff0c;然后通过菜单的点击事件完成的跳转&#xff0c;现在可以进行优化&#xff0c;直…

深入解析 Java Stream API:筛选子节点的优雅实现!!!

&#x1f680; 深入解析 Java Stream API&#xff1a;筛选子节点的优雅实现 &#x1f527; 大家好&#xff01;&#x1f44b; 今天我们来聊聊 Java 8 中一个非常常见的操作&#xff1a;使用 Stream API 从 Map 中筛选出特定条件的元素。&#x1f389; 具体来说&#xff0c;我们…

统计学重要概念:自由度

在统计学中&#xff0c;自由度&#xff08;degrees of freedom&#xff0c;简称df&#xff09;是一个重要的概念&#xff0c;它表示在计算某个统计量时可以自由变化的值的数量。对于一个样本量为n的样本&#xff0c;自由度通常为n-1&#xff0c;这是因为我们需要用样本数据来估…

数据结构-排序

文章目录 1. 排序的概念2. 常见排序算法的实现2.1 插入排序1&#xff09;插入排序一&#xff09;基本思想二&#xff09;特性及时间复杂度三&#xff09;代码实现 2&#xff09;希尔排序&#xff08;缩小增量排序&#xff09;一&#xff09;基本思想二&#xff09;特性及时间复…