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)原题链接
欢迎大家和我沟通交流(✿◠‿◠)
相关文章:
LeetCode 热题 100_划分字母区间(80_763_中等_C++)(贪心算法(求并集))
LeetCode 热题 100_划分字母区间(80_763) 题目描述:输入输出样例:题解:解题思路:思路一(贪心算法(求交集)): 代码实现代码实现(思路一(贪心算法(求…...
C++ --- 多态
1 多态的概念 多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态),这⾥我们重点讲运⾏时多态,编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主要就是我…...
HAL库中使用空闲中断+DMA接收数据,接收失败的问题
问题: 串口屏与单片机通过串口(USART1)进行通信,调试时发现问题,现象如下: 手动页面的几个文本,输入的数字不会显示出来,比如初始值为0,输入200,200会一闪而…...
【STM32实物】基于STM32的扫地机器人/小车控制系统设计
基于STM32的扫地机器人/小车控制系统设计 演示视频: 基于STM32的扫地机器人小车控制系统设计 简介:扫地机器人系统采用分层结构设计,主要包括底层硬件控制层、中间数据处理层和上层用户交互层。底层硬件控制层负责对各个硬件模块进行控制和数据采集,中间数据处理层负责对采…...
【Scrapy】Scrapy教程8——处理子链接
通过前面几篇文章,已经了解了如何去爬取网页内容并存储到数据库,但是目前只是存储了一个页面的内容,现在想要获取每篇文章链接内的文章内容,我们来看看怎么获取。 生成新请求 首先我们肯定要先拿到链接,所以第一步都获取文章标题和链接肯定少不了,然后再爬取获取到到子…...
使用pycel将Excel移植到Python
1.适用需求 有些工作可能长期适用excel来进行公式计算,当需要把工作流程转换为可视化界面时,开发人员不懂专业逻辑,手动摸索公式很大可能出错,而且费时费力 2.可用工具及缺点 pandas 方便进行数据处理,支持各种格…...
学习应用层
应用层概述 客户/服务器方式(C/S)和对等方式(P2P) 动态主机配置协议DHCP 客户/服务器方式 DHCP报文会被封装成为UDP用户数据报,DHCP服务器端口号是UDP67,用户是UDP68。 广播发送,是因为并不知道…...
Doris官网上没有的一些Fe参数了,都在源码中
一、FE配置源码 apache-doris-src\fe\fe-common\src\main\java\org\apache\doris\common\Config.java 二、BE配置源码 apache-doris-src\be\src\common\config.cpp 三、FE源码 package org.apache.doris.common;public class Config extends ConfigBase {ConfField(descri…...
蓝桥杯算法精讲:二分查找实战与变种解析
适合人群:蓝桥杯备考生 | 算法竞赛入门者 | 二分查找进阶学习者 目录 一、二分查找核心要点 1. 算法思想 2. 适用条件 3. 算法模板 二、蓝桥杯真题实战 例题1:分巧克力(蓝桥杯2017省赛) 例题2:砍竹子࿰…...
C++脚本化方案调研
1 什么是脚本化 脚本化(Scripting)是指将脚本语言嵌入到主程序(C等编译型语言)中,通过以下方式扩展程序能力: 动态逻辑控制:通过脚本实现运行时逻辑调整,无需重新编译主程序&#x…...
蓝桥杯(N皇后问题)------回溯法
题目描述 在 NN 的方格棋盘放置了 N 个皇后,使得它们不相互攻击(即任意 2 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 45 角的斜线上。你的任务是,对于给定的 N,求出有多少种合法的放置方法…...
再探C语言(1)
温馨提示: 学C语言就像玩《掘地求升》——你以为懂了语法就能通关? 不!编译器会用铁锤教你做人!(╯‵□′)╯︵┻━┻ 🐱Part 1:sizeofの跨平台迷惑行为 Q1. 不同环境下sizeof(int)的结果 运行环境结果&a…...
高项第十三章——项目资源管理
什么是资源管理?项目资源管理包括识别、获取和管理所需资源以成功完成项目的各个过程。 本过程关注两类资源:实物资源包括设备、材料、设施和基础设施 团队资源或人员指的是团队的人力资源 13_1 项目资源管理基础 项目团队是执行项目工作,…...
C/C++转换为字符串宏和字符串拼接宏的综合使用
本文内容参考: C/C++ 宏拼接和宏展开为字符串 - DoubleLi - 博客园 特此致谢! 1. 转换为字符串宏与字符串拼接宏 (1)转换为字符串宏 转换为字符串的宏为: #define STR(x) #x //转字符串 (2)字符串拼接宏 字符串拼接的宏为: #define CONCAT(x,y) x##y //拼接 2…...
Linux:xxx is not in the sudoers file. This incident will be reported.
报错 xxx is not in the sudoers file. This incident will be reported.解决方式 切换到root用户下操作 # 1、修改/etc/sudoers文件为可修改,默认是只读的 ls -lh /etc/sudoers -r--r----- 1 root root 4.3K Dec 1 01:45 /etc/sudoerschmod uw /etc/sudoersls…...
掌握新编程语言的秘诀:利用 AI 快速上手 Python、Go、Java 和 Rust
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
个人常用的chrome好用插件
chrome可以说是兼容性和实用性较高的浏览器 没有复杂的ui 沉重的广告 加上各种各样的浏览器插件 现在罗列一下个人常用的几款好用的插件 1. Adblock Plus 一款免费的广告拦截器,可以拦截大部分网站上的广告推荐,还你一个干净舒服的页面 以下为b站演示…...
Redis 内存优化
Redis 内存优化 Redis性能优化可以从多个方面进行,主要包括以下几个方面: 1. 内存优化 Redis 是基于内存的数据库,优化内存使用可以提高性能并降低成本。 (1) 使用合适的数据结构 不同的数据结构占用的内存不同,选择合适的数据…...
数据库设计-笔记2
1.介绍一下MySQL 历史与发展 MySQL 最初由瑞典的 MySQL AB 公司开发,于 1995 年正式发布。2008 年,MySQL AB 公司被 Sun Microsystems 收购,之后 Sun 又被甲骨文(Oracle)公司收购,MySQL 成为 Oracle 旗下…...
【大模型】什么是循环神经网络(RNNs)
在人工智能(AI)的世界里,**循环神经网络(Recurrent Neural Networks, RNNs)**是一种非常强大的工具,特别适合处理序列数据。无论是语言、时间序列还是音乐,RNNs都能帮助我们理解和预测这些数据的…...
hexo+butterfly搭建博客网站总结篇
hexobutterfly搭建博客网站总结篇 文章目录 hexobutterfly搭建博客网站总结篇0.往期栏目1.发现的不错的butterfly博主2.待实现的功能 && 结语笔者待实现的功能结语 0.往期栏目 个人博客网站搭建_为了前进而后退,为了走直路而走弯路的博客-CSDN博客 【Node…...
损失函数理解(二)——交叉熵损失
损失函数的目的是为了定量描述不同模型(例如神经网络模型和人脑模型)的差异。 交叉熵,顾名思义,与熵有关,先把模型换成熵这么一个数值,然后用这个数值比较不同模型之间的差异。 为什么要做这一步转换&…...
基于随机森林回归预测葡萄酒质量
基于随机森林回归预测葡萄酒质量 1.作者介绍2.随机森林算法与数据集介绍2.1定义2.2核心思想2.3主要步骤2.4数据集介绍 3.算法实现3.1数据加载与探索3.2数据可视化3.3数据预处理(标准化、划分训练/测试集)3.4模型训练与优化(随机森林回归 超参…...
【Qt】QWidget属性2
🏠个人主页:Yui_ 🍑操作环境:Qt Creator 🚀所属专栏:Qt 文章目录 1. windowOpacity属性2. cursor属性2.1 自定义光标 3. font属性4.tooltip属性5. focusPolicy属性6. 总结 由于QWidget的常见属性实在太多&a…...
OpenGL ES ->乒乓缓冲,计算只用两个帧缓冲对象(Frame Buffer Object)+叠加多个滤镜作用后的Bitmap
乒乓缓冲核心思想 不使用乒乓缓冲,如果要每个滤镜作用下的绘制内容,也就是这个滤镜作用下的帧缓冲,需要创建一个Frame Buffer Object加上对应的Frame Buffer Object Texture使用乒乓缓冲,只用两个Frame Buffer Object加上对应的F…...
数据库练习2
目录 1.向heros表中新增一列信息,添加一些约束,并尝试查询一些信息 2.课堂代码练习 3.题目如下 一、单表查询 1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号,不显示重复的部门号。 3、求出所有职工的人数。 4…...
macOS Sequoia 15.3 一直弹出“xx正在访问你的屏幕”
🙅 问题描述 macOS 系统升级后(15.2或者15.3均出现过此问题),不管是截图还是开腾讯会议,只要跟捕捉屏幕有关,都一直弹出这个选项,而且所有软件我都允许访问屏幕了,这个不是询问是否…...
OpenCV图像拼接(1)自动校准之校准旋转相机的函数calibrateRotatingCamera()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::calibrateRotatingCamera 是OpenCV中用于校准旋转相机的函数。它特别适用于那种相机相对于一个固定的场景进行纯旋转运动的情况&…...
Conda常用命令汇总(持续更新中)
原文章:安装和使用Miniconda来管理Python环境-CSDN博客 一、Miniconda的使用 Miniconda没有GUI界面,只能通过conda命令对Python环境和软件包进行管理,所以这里主要介绍一下conda的常用命令。 1. Conda相关 (1)查询conda版本 conda --vers…...
C# 调用 VITS,推理模型 将文字转wav音频调试 -数字人分支
Microsoft.ML.OnnxRuntime.OnnxRuntimeException: [ErrorCode:InvalidArgument] Input name: input_name is not in the metadata在 Microsoft.ML.OnnxRuntime.InferenceSession.LookupInputMetadata(String nodeName) 位置 D:\a\_work\1\s\csharp\src\Microsoft.ML.OnnxRuntim…...
